From: Douglas Gregor Date: Wed, 15 Feb 2012 15:57:22 +0000 (+0000) Subject: Specialize the diagnostic complaining about conflicting types of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e88df72e690498aeba2dc3d5089388b27be66fa;p=clang Specialize the diagnostic complaining about conflicting types of return statements within a lambda; this diagnostic previously referred to blocks. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150584 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 0b6d774866..e5bba692a0 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -4142,8 +4142,8 @@ def err_typecheck_convert_incompatible : Error< "%select{none|const|restrict|const and restrict|volatile|const and volatile|" "volatile and restrict|const, volatile, and restrict}6)}4">; def err_typecheck_missing_return_type_incompatible : Error< - "return type %0 must match previous return type %1 when block" - " literal has unspecified explicit return type">; + "return type %0 must match previous return type %1 when %select{block " + "literal|lambda expression}2 has unspecified explicit return type">; def warn_incompatible_qualified_id : Warning< "%select{assigning to|passing|returning|converting|initializing|sending|casting}2" diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index b47e3d29d1..4351e9ba10 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1847,9 +1847,9 @@ Sema::ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) { !CurCap->ReturnType->isDependentType() && !ReturnT->isDependentType() && !Context.hasSameType(ReturnT, CurCap->ReturnType)) { - // FIXME: Adapt diagnostic for lambdas. Diag(ReturnLoc, diag::err_typecheck_missing_return_type_incompatible) - << ReturnT << CurCap->ReturnType; + << ReturnT << CurCap->ReturnType + << getCurLambda() != 0; return StmtError(); } CurCap->ReturnType = ReturnT; diff --git a/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp b/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp index 586825f053..d816e1702a 100644 --- a/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp +++ b/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp @@ -37,8 +37,8 @@ X infer_X_return_type_fail(X x) { return [x](int y) { // expected-warning{{omitted result type}} if (y > 0) return X(); - else // FIXME: shouldn't mention blocks - return x; // expected-error{{return type 'const X' must match previous return type 'X' when block literal has unspecified explicit return type}} + else + return x; // expected-error{{return type 'const X' must match previous return type 'X' when lambda expression has unspecified explicit return type}} }(5); }