From: Anders Carlsson Date: Tue, 13 Oct 2009 21:49:31 +0000 (+0000) Subject: More return type checking. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=07d68f1f0760110d430c4b849abd49f12777f09c;p=clang More return type checking. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84034 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 194317ce23..56dd670233 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1572,9 +1572,7 @@ Sema::ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, } // Determine the result type - QualType ResultTy - = FnDecl->getType()->getAs()->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 + 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 diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index e44a6989c7..7b79fa5f4a 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -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) diff --git a/test/SemaCXX/incomplete-call.cpp b/test/SemaCXX/incomplete-call.cpp index 305c437169..cdb81f3934 100644 --- a/test/SemaCXX/incomplete-call.cpp +++ b/test/SemaCXX/incomplete-call.cpp @@ -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'}} }