diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-02-11 01:18:59 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-02-11 01:18:59 +0000 |
commit | 6f233ef1d893dfc3b1555c84176847cb484126e7 (patch) | |
tree | c5aabca4dd530a6b846e30b28e1fdcf48765e9e6 /clang/lib/Sema/SemaOverload.cpp | |
parent | f9cf4fa08c876bb9e44e260ee72e2f1046ace9ba (diff) | |
download | bcm5719-llvm-6f233ef1d893dfc3b1555c84176847cb484126e7.tar.gz bcm5719-llvm-6f233ef1d893dfc3b1555c84176847cb484126e7.zip |
Add semantic checking for template arguments that correspond to
non-type template parameters that are references to functions or
pointers to member functions. Did a little bit of refactoring so that
these two cases, along with the handling of non-type template
parameters that are pointers to functions, are handled by the same
path.
Also, tweaked FixOverloadedFunctionReference to cope with member
function pointers. This is a necessary step for getting all of the fun
member pointer conversions working outside of template arguments, too.
llvm-svn: 64277
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 64c61e17ad1..e40455b5c6d 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -3952,6 +3952,25 @@ void Sema::FixOverloadedFunctionReference(Expr *E, FunctionDecl *Fn) { } else if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(E)) { assert(UnOp->getOpcode() == UnaryOperator::AddrOf && "Can only take the address of an overloaded function"); + if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Fn)) { + if (Method->isStatic()) { + // Do nothing: static member functions aren't any different + // from non-member functions. + } + else if (QualifiedDeclRefExpr *DRE + = dyn_cast<QualifiedDeclRefExpr>(UnOp->getSubExpr())) { + // We have taken the address of a pointer to member + // function. Perform the computation here so that we get the + // appropriate pointer to member type. + DRE->setDecl(Fn); + DRE->setType(Fn->getType()); + QualType ClassType + = Context.getTypeDeclType(cast<RecordDecl>(Method->getDeclContext())); + E->setType(Context.getMemberPointerType(Fn->getType(), + ClassType.getTypePtr())); + return; + } + } FixOverloadedFunctionReference(UnOp->getSubExpr(), Fn); E->setType(Context.getPointerType(UnOp->getSubExpr()->getType())); } else if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) { |