diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-10-15 00:41:48 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-10-15 00:41:48 +0000 |
| commit | 63dce025449eecf17678ce1c5b6fac4a1b582e9e (patch) | |
| tree | 8f265a290687f50985ddc9680a34a13b659231dd /clang | |
| parent | 3254182bfa60bac54809bd3b515b89548dbee2e4 (diff) | |
| download | bcm5719-llvm-63dce025449eecf17678ce1c5b6fac4a1b582e9e.tar.gz bcm5719-llvm-63dce025449eecf17678ce1c5b6fac4a1b582e9e.zip | |
Check the return type when calling pointer to member functions.
llvm-svn: 84161
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 17 | ||||
| -rw-r--r-- | clang/test/SemaCXX/incomplete-call.cpp | 6 |
2 files changed, 15 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index d8e49c7d694..a946500660e 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2917,15 +2917,18 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc, if (BO->getOpcode() == BinaryOperator::PtrMemD || BO->getOpcode() == BinaryOperator::PtrMemI) { const FunctionProtoType *FPT = cast<FunctionProtoType>(BO->getType()); - QualType ReturnTy = FPT->getResultType(); + QualType ResultTy = FPT->getResultType().getNonReferenceType(); - CXXMemberCallExpr *CE = - new (Context) CXXMemberCallExpr(Context, BO, Args, NumArgs, - ReturnTy.getNonReferenceType(), - RParenLoc); - - ExprOwningPtr<CXXMemberCallExpr> TheCall(this, CE); + ExprOwningPtr<CXXMemberCallExpr> + TheCall(this, new (Context) CXXMemberCallExpr(Context, BO, Args, + NumArgs, ResultTy, + RParenLoc)); + if (CheckCallReturnType(FPT->getResultType(), + BO->getRHS()->getSourceRange().getBegin(), + TheCall.get(), 0)) + return ExprError(); + if (ConvertArgumentsForCall(&*TheCall, BO, 0, FPT, Args, NumArgs, RParenLoc)) return ExprError(); diff --git a/clang/test/SemaCXX/incomplete-call.cpp b/clang/test/SemaCXX/incomplete-call.cpp index 6134189f0a9..08bfdefd624 100644 --- a/clang/test/SemaCXX/incomplete-call.cpp +++ b/clang/test/SemaCXX/incomplete-call.cpp @@ -1,5 +1,5 @@ // RUN: clang-cc -fsyntax-only -verify %s -struct A; // expected-note 13 {{forward declaration of 'struct A'}} +struct A; // expected-note 14 {{forward declaration of 'struct A'}} A f(); // expected-note {{note: 'f' declared here}} @@ -35,4 +35,8 @@ void g() { b[0]; // expected-error {{calling 'operator[]' with incomplete return type 'struct A'}} b + 1; // expected-error {{calling 'operator+' with incomplete return type 'struct A'}} b->f(); // expected-error {{calling 'operator->' with incomplete return type 'struct A'}} + + A (B::*mfp)() = 0; + (b.*mfp)(); // expected-error {{calling function with incomplete return type 'struct A'}} + } |

