diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-07-08 10:57:20 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-07-08 10:57:20 +0000 |
commit | daa439a6c47d3299157b94a496bf22389bbc77a3 (patch) | |
tree | 6feee6febbc6cd97f259c21b977c4b303da7d4cc /lib/Sema/SemaLookup.cpp | |
parent | 466850963074ea7becc6fdc3de3dfa226cc87bdd (diff) |
Fix a corner case with argument-dependent lookup and overloaded function sets.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74999 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaLookup.cpp')
-rw-r--r-- | lib/Sema/SemaLookup.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 343cbae673..c88321e1a3 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -19,6 +19,7 @@ #include "clang/AST/DeclObjC.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" +#include "clang/AST/ExprCXX.h" #include "clang/Parse/DeclSpec.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/LangOptions.h" @@ -1579,18 +1580,24 @@ Sema::FindAssociatedClassesAndNamespaces(Expr **Args, unsigned NumArgs, // classes and namespaces associated with its (non-dependent) // parameter types and return type. DeclRefExpr *DRE = 0; + TemplateIdRefExpr *TIRE = 0; + Arg = Arg->IgnoreParens(); if (UnaryOperator *unaryOp = dyn_cast<UnaryOperator>(Arg)) { - if (unaryOp->getOpcode() == UnaryOperator::AddrOf) + if (unaryOp->getOpcode() == UnaryOperator::AddrOf) { DRE = dyn_cast<DeclRefExpr>(unaryOp->getSubExpr()); - } else + TIRE = dyn_cast<TemplateIdRefExpr>(unaryOp->getSubExpr()); + } + } else { DRE = dyn_cast<DeclRefExpr>(Arg); - if (!DRE) - continue; - - // FIXME: The declaration might be a FunctionTemplateDecl (by itself) - // or might be buried in a TemplateIdRefExpr. - OverloadedFunctionDecl *Ovl - = dyn_cast<OverloadedFunctionDecl>(DRE->getDecl()); + TIRE = dyn_cast<TemplateIdRefExpr>(Arg); + } + + OverloadedFunctionDecl *Ovl = 0; + if (DRE) + Ovl = dyn_cast<OverloadedFunctionDecl>(DRE->getDecl()); + else if (TIRE) + Ovl = dyn_cast_or_null<OverloadedFunctionDecl>( + TIRE->getTemplateName().getAsTemplateDecl()); if (!Ovl) continue; |