Check the return type when calling pointer to member functions.

llvm-svn: 84161
This commit is contained in:
Anders Carlsson 2009-10-15 00:41:48 +00:00
parent 3254182bfa
commit 63dce02544
2 changed files with 15 additions and 8 deletions

View File

@ -2917,15 +2917,18 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc,
if (BO->getOpcode() == BinaryOperator::PtrMemD || if (BO->getOpcode() == BinaryOperator::PtrMemD ||
BO->getOpcode() == BinaryOperator::PtrMemI) { BO->getOpcode() == BinaryOperator::PtrMemI) {
const FunctionProtoType *FPT = cast<FunctionProtoType>(BO->getType()); const FunctionProtoType *FPT = cast<FunctionProtoType>(BO->getType());
QualType ReturnTy = FPT->getResultType(); QualType ResultTy = FPT->getResultType().getNonReferenceType();
CXXMemberCallExpr *CE = ExprOwningPtr<CXXMemberCallExpr>
new (Context) CXXMemberCallExpr(Context, BO, Args, NumArgs, TheCall(this, new (Context) CXXMemberCallExpr(Context, BO, Args,
ReturnTy.getNonReferenceType(), NumArgs, ResultTy,
RParenLoc); RParenLoc));
ExprOwningPtr<CXXMemberCallExpr> TheCall(this, CE);
if (CheckCallReturnType(FPT->getResultType(),
BO->getRHS()->getSourceRange().getBegin(),
TheCall.get(), 0))
return ExprError();
if (ConvertArgumentsForCall(&*TheCall, BO, 0, FPT, Args, NumArgs, if (ConvertArgumentsForCall(&*TheCall, BO, 0, FPT, Args, NumArgs,
RParenLoc)) RParenLoc))
return ExprError(); return ExprError();

View File

@ -1,5 +1,5 @@
// RUN: clang-cc -fsyntax-only -verify %s // 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}} 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[0]; // expected-error {{calling 'operator[]' with incomplete return type 'struct A'}}
b + 1; // 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'}} 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'}}
} }