зеркало из https://github.com/microsoft/clang-1.git
More return type checking.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84034 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
cd542a1d8f
Коммит
07d68f1f07
|
@ -1572,9 +1572,7 @@ Sema::ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
|
|||
}
|
||||
|
||||
// Determine the result type
|
||||
QualType ResultTy
|
||||
= FnDecl->getType()->getAs<FunctionType>()->getResultType();
|
||||
ResultTy = ResultTy.getNonReferenceType();
|
||||
QualType ResultTy = FnDecl->getResultType().getNonReferenceType();
|
||||
|
||||
// Build the actual expression node.
|
||||
Expr *FnExpr = new (Context) DeclRefExpr(FnDecl, FnDecl->getType(),
|
||||
|
@ -1583,9 +1581,15 @@ Sema::ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
|
|||
|
||||
Input.release();
|
||||
Args[0] = Arg;
|
||||
return Owned(new (Context) CXXOperatorCallExpr(Context, OverOp, FnExpr,
|
||||
Args, 2, ResultTy,
|
||||
OpLoc));
|
||||
|
||||
ExprOwningPtr<CXXOperatorCallExpr>
|
||||
TheCall(this, new (Context) CXXOperatorCallExpr(Context, OverOp,
|
||||
FnExpr, Args, 2,
|
||||
ResultTy, OpLoc));
|
||||
|
||||
if (CheckCallReturnType(FnDecl->getResultType(), OpLoc, TheCall.get(),
|
||||
FnDecl))
|
||||
return ExprError();
|
||||
} else {
|
||||
// We matched a built-in operator. Convert the arguments, then
|
||||
// break out so that we will build the appropriate built-in
|
||||
|
|
|
@ -5050,6 +5050,10 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Object,
|
|||
ResultTy, RParenLoc));
|
||||
delete [] MethodArgs;
|
||||
|
||||
if (CheckCallReturnType(Method->getResultType(), LParenLoc, TheCall.get(),
|
||||
Method))
|
||||
return true;
|
||||
|
||||
// We may have default arguments. If so, we need to allocate more
|
||||
// slots in the call for them.
|
||||
if (NumArgs < NumArgsInProto)
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
// RUN: clang-cc -fsyntax-only -verify %s
|
||||
struct A; // expected-note 8 {{forward declaration of 'struct A'}}
|
||||
struct A; // expected-note 10 {{forward declaration of 'struct A'}}
|
||||
|
||||
A f(); // expected-note {{note: 'f' declared here}}
|
||||
|
||||
struct B {
|
||||
A f(); // expected-note {{'f' declared here}}
|
||||
A operator()(); // expected-note {{'operator()' declared here}}
|
||||
A operator()(); // expected-note 2 {{'operator()' declared here}}
|
||||
operator A(); // expected-note {{'operator A' declared here}}
|
||||
A operator!(); // expected-note 2 {{'operator!' declared here}}
|
||||
A operator++(int); // expected-note {{'operator++' declared here}}
|
||||
};
|
||||
|
||||
void g() {
|
||||
|
@ -26,4 +27,6 @@ void g() {
|
|||
b.operator!(); // expected-error {{calling 'operator!' with incomplete return type 'struct A'}}
|
||||
|
||||
!b; // expected-error {{calling 'operator!' with incomplete return type 'struct A'}}
|
||||
b(); // expected-error {{calling 'operator()' with incomplete return type 'struct A'}}
|
||||
b++; // expected-error {{calling 'operator++' with incomplete return type 'struct A'}}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче