[cfe-commits] r150194 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaStmt.cpp test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp
Douglas Gregor
dgregor at apple.com
Thu Feb 9 10:40:40 PST 2012
Author: dgregor
Date: Thu Feb 9 12:40:39 2012
New Revision: 150194
URL: http://llvm.org/viewvc/llvm-project?rev=150194&view=rev
Log:
Don't allow deduction of a lambda result type from an initializer
list; it is not an expression.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaStmt.cpp
cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=150194&r1=150193&r2=150194&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Feb 9 12:40:39 2012
@@ -4130,6 +4130,8 @@
"C++11 requires lambda with omitted result type to consist of a single "
"return statement">,
InGroup<DiagGroup<"lambda-return">>;
+def err_lambda_return_init_list : Error<
+ "cannot deduce lambda return type from initializer list">;
def err_operator_arrow_circular : Error<
"circular pointer delegation detected">;
Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=150194&r1=150193&r2=150194&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
+++ cfe/trunk/lib/Sema/SemaStmt.cpp Thu Feb 9 12:40:39 2012
@@ -1798,7 +1798,7 @@
CapturingScopeInfo *CurCap = cast<CapturingScopeInfo>(getCurFunction());
if (CurCap->HasImplicitReturnType) {
QualType ReturnT;
- if (RetValExp) {
+ if (RetValExp && !isa<InitListExpr>(RetValExp)) {
ExprResult Result = DefaultFunctionArrayLvalueConversion(RetValExp);
if (Result.isInvalid())
return StmtError();
@@ -1808,7 +1808,15 @@
ReturnT = RetValExp->getType();
else
ReturnT = Context.DependentTy;
- } else {
+ } else {
+ if (RetValExp) {
+ // C++11 [expr.lambda.prim]p4 bans inferring the result from an
+ // initializer list, because it is not an expression (even
+ // though we represent it as one). We still deduce 'void'.
+ Diag(ReturnLoc, diag::err_lambda_return_init_list)
+ << RetValExp->getSourceRange();
+ }
+
ReturnT = Context.VoidTy;
}
// We require the return types to strictly match here.
Modified: cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp?rev=150194&r1=150193&r2=150194&view=diff
==============================================================================
--- cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp (original)
+++ cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp Thu Feb 9 12:40:39 2012
@@ -17,6 +17,7 @@
switch (x) {
case 0: return get<void>();
case 1: return;
+ case 2: return { 1, 2.0 }; // expected-error{{cannot deduce lambda return type from initializer list}}
}
}(7);
}
More information about the cfe-commits
mailing list