[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