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 | be759256b961e9b598d6b6b1cc9b0e25b2002989 (patch) | |
tree | 0fb7a9e41af39b490563bc219fcd9cb91cab4cda /clang/lib/Sema/SemaLookup.cpp | |
parent | ed3c80eb753000130d50281599bb021a4237e2a3 (diff) | |
download | bcm5719-llvm-be759256b961e9b598d6b6b1cc9b0e25b2002989.tar.gz bcm5719-llvm-be759256b961e9b598d6b6b1cc9b0e25b2002989.zip |
Fix a corner case with argument-dependent lookup and overloaded function sets.
llvm-svn: 74999
Diffstat (limited to 'clang/lib/Sema/SemaLookup.cpp')
-rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 343cbae673a..c88321e1a35 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/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; |