forked from OSchip/llvm-project
Check the return type when calling pointer to member functions.
llvm-svn: 84161
This commit is contained in:
parent
3254182bfa
commit
63dce02544
|
@ -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();
|
||||||
|
|
|
@ -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'}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue