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 ||
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();

View File

@ -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'}}
}