Skip to content
  • Douglas Gregor's avatar
    Refactor the way we handle operator overloading and template · 1baf54e1
    Douglas Gregor authored
    instantiation for binary operators. This change moves most of the
    operator-overloading code from the parser action ActOnBinOp to a new,
    parser-independent semantic checking routine CreateOverloadedBinOp. 
    
    Of particular importance is the fact that CreateOverloadedBinOp does
    *not* perform any name lookup based on the current parsing context (it
    doesn't take a Scope*), since it has to be usable during template
    instantiation, when there is no scope information. Rather, it takes a
    pre-computed set of functions that are visible from the context or via
    argument-dependent lookup, and adds to that set any member operators
    and built-in operator candidates. The set of functions is computed in
    the parser action ActOnBinOp based on the current context (both
    operator name lookup and argument-dependent lookup). Within a
    template, the set computed by ActOnBinOp is saved within the
    type-dependent AST node and is augmented with the results of
    argument-dependent name lookup at instantiation time (see
    TemplateExprInstantiator::VisitCXXOperatorCallExpr).
    
    Sadly, we can't fully test this yet. I'll follow up with template
    instantiation for sizeof so that the real fun can begin.
    
    llvm-svn: 66923
    1baf54e1
Loading