aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-04-27 00:36:17 +0000
committerJohn McCall <rjmccall@apple.com>2011-04-27 00:36:17 +0000
commitf5307514ee48978b5e17e42542e111afee4ce62b (patch)
treea97f371ac0b609fa07c77951a2d87831866a0137 /lib/Sema/SemaExpr.cpp
parent0f7b3dcece1475130e2946d66dbe3075059b31f7 (diff)
FixOverloadedFunctionReference needs to rebuild member accesses of
instance methods to have bound-member type. Fixing that broke __unknown_anytype, which I've in turn fixed. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130266 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r--lib/Sema/SemaExpr.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 212f584f5f..73fe0003f0 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -10478,16 +10478,17 @@ ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *call) {
Expr *callee = call->getCallee();
enum FnKind {
- FK_Function,
+ FK_MemberFunction,
FK_FunctionPointer,
FK_BlockPointer
};
FnKind kind;
QualType type = callee->getType();
- if (type->isFunctionType()) {
- assert(isa<CXXMemberCallExpr>(call) || isa<CXXOperatorCallExpr>(call));
- kind = FK_Function;
+ if (type == S.Context.BoundMemberTy) {
+ assert(isa<CXXMemberCallExpr>(call) || isa<CXXOperatorCallExpr>(call));
+ kind = FK_MemberFunction;
+ type = Expr::findBoundMemberType(callee);
} else if (const PointerType *ptr = type->getAs<PointerType>()) {
type = ptr->getPointeeType();
kind = FK_FunctionPointer;
@@ -10525,7 +10526,7 @@ ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *call) {
// Rebuild the appropriate pointer-to-function type.
switch (kind) {
- case FK_Function:
+ case FK_MemberFunction:
// Nothing to do.
break;
@@ -10594,13 +10595,16 @@ ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *expr, ValueDecl *decl) {
// - functions
if (FunctionDecl *fn = dyn_cast<FunctionDecl>(decl)) {
- if (CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(fn))
- if (method->isInstance()) valueKind = VK_RValue;
-
// This is true because FunctionDecls must always have function
// type, so we can't be resolving the entire thing at once.
assert(type->isFunctionType());
+ if (CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(fn))
+ if (method->isInstance()) {
+ valueKind = VK_RValue;
+ type = S.Context.BoundMemberTy;
+ }
+
// Function references aren't l-values in C.
if (!S.getLangOptions().CPlusPlus)
valueKind = VK_RValue;