aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-10-07 22:26:29 +0000
committerAnders Carlsson <andersca@mac.com>2009-10-07 22:26:29 +0000
commit6e8f550439c09f3f044d651354e297518b553712 (patch)
tree94fbcb27fc33f81336a014503558d1d16b2b9f9a
parent71fdaf4c5e33bed9b9133a5c3bbdbd930a702a6c (diff)
Handle MemberExprs in ResolveAddressOfOverloadedFunction.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83495 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaOverload.cpp3
-rw-r--r--test/SemaCXX/addr-of-overloaded-function.cpp10
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index e7cd4fb575..4de8366816 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -4117,6 +4117,9 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType,
if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(OvlExpr)) {
Ovl = dyn_cast<OverloadedFunctionDecl>(DR->getDecl());
FunctionTemplate = dyn_cast<FunctionTemplateDecl>(DR->getDecl());
+ } else if (MemberExpr *ME = dyn_cast<MemberExpr>(OvlExpr)) {
+ Ovl = dyn_cast<OverloadedFunctionDecl>(ME->getMemberDecl());
+ FunctionTemplate = dyn_cast<FunctionTemplateDecl>(ME->getMemberDecl());
}
// If there's no overloaded function declaration or function template,
diff --git a/test/SemaCXX/addr-of-overloaded-function.cpp b/test/SemaCXX/addr-of-overloaded-function.cpp
index c2a6b50118..80ea02bafd 100644
--- a/test/SemaCXX/addr-of-overloaded-function.cpp
+++ b/test/SemaCXX/addr-of-overloaded-function.cpp
@@ -44,3 +44,13 @@ void h_test() {
ha(h1);
hb(h1);
}
+
+struct A { };
+void f(void (*)(A *));
+
+struct B
+{
+ void g() { f(d); }
+ void d(void *);
+ static void d(A *);
+};