diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-10-03 17:40:22 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-10-03 17:40:22 +0000 |
| commit | 61914b512ab23f23cce9e84da2b4da9c66876c84 (patch) | |
| tree | ff5e449b36103db12fe799ec072d8a75291f58b6 /clang/lib/Sema/SemaExpr.cpp | |
| parent | de55f647ff07469afd22628424ffc289cdc88d94 (diff) | |
| download | bcm5719-llvm-61914b512ab23f23cce9e84da2b4da9c66876c84.tar.gz bcm5719-llvm-61914b512ab23f23cce9e84da2b4da9c66876c84.zip | |
Create CXXMemberCallExpr for pointer-to-member calls.
llvm-svn: 83268
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 7b7ee820c51..e7b074b43c3 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2902,6 +2902,28 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc, return Owned(BuildCallToMemberFunction(S, Fn, LParenLoc, Args, NumArgs, CommaLocs, RParenLoc)); } + + // Determine whether this is a call to a pointer-to-member function. + if (BinaryOperator *BO = dyn_cast<BinaryOperator>(Fn->IgnoreParens())) { + if (BO->getOpcode() == BinaryOperator::PtrMemD || + BO->getOpcode() == BinaryOperator::PtrMemI) { + const FunctionProtoType *FPT = cast<FunctionProtoType>(BO->getType()); + QualType ReturnTy = FPT->getResultType(); + + CXXMemberCallExpr *CE = + new (Context) CXXMemberCallExpr(Context, BO, Args, NumArgs, + ReturnTy.getNonReferenceType(), + RParenLoc); + + ExprOwningPtr<CXXMemberCallExpr> TheCall(this, CE); + + if (ConvertArgumentsForCall(&*TheCall, BO, 0, FPT, Args, NumArgs, + RParenLoc)) + return ExprError(); + + return Owned(MaybeBindToTemporary(TheCall.release()).release()); + } + } } // If we're directly calling a function, get the appropriate declaration. |

