]> granicus.if.org Git - clang/commitdiff
put back diagnostics when flexible members are captured
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 9 Jan 2013 00:09:15 +0000 (00:09 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 9 Jan 2013 00:09:15 +0000 (00:09 +0000)
in lambdas.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171921 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaObjCXX/capturing-flexible-array-in-block.mm

index 691da354517ecded499eb23436f2f74a1b94c84e..4d8f2670983a92622798c2a09304cc8abc77794a 100644 (file)
@@ -4612,6 +4612,9 @@ let CategoryName = "Lambda Issue" in {
   def err_lambda_capture_vm_type : Error<
     "variable %0 with variably modified type cannot be captured in "
     "a lambda expression">;
+  def err_lambda_capture_flexarray_type : Error<
+    "variable %0 with flexible array member cannot be captured in "
+    "a lambda expression">;
   def err_lambda_impcap : Error<
     "variable %0 cannot be implicitly captured in a lambda with no "
     "capture-default specified">;
index 5b7a39674b0edbea72f289243fbd6d41e86e379e..96196e06931641cd56bb389c220c0a34a96759b8 100644 (file)
@@ -10762,10 +10762,13 @@ bool Sema::tryCaptureVariable(VarDecl *Var, SourceLocation Loc,
     // Prohibit structs with flexible array members too.
     // We cannot capture what is in the tail end of the struct.
     if (const RecordType *VTTy = Var->getType()->getAs<RecordType>()) {
-      if (VTTy->getDecl()->hasFlexibleArrayMember() && IsBlock) {
+      if (VTTy->getDecl()->hasFlexibleArrayMember()) {
         if (BuildAndDiagnose) {
           if (IsBlock)
             Diag(Loc, diag::err_ref_flexarray_type);
+          else
+            Diag(Loc, diag::err_lambda_capture_flexarray_type)
+              << Var->getDeclName();
           Diag(Var->getLocation(), diag::note_previous_decl)
             << Var->getDeclName();
         }
index 6ffe3501355b8dc9ce73f7afb520db98992be311..d7d888564c1e3bd4f5dc1cc12415a3696bcd5039 100644 (file)
@@ -1,7 +1,8 @@
-// RUN: %clang_cc1 -fsyntax-only -fblocks -verify %s
+// RUN: %clang_cc1 -fsyntax-only -fblocks -verify -std=c++11 %s
 // rdar://12655829
 
 void f() {
-  struct { int x; int y[]; } a; // expected-note {{'a' declared here}}
+  struct { int x; int y[]; } a; // expected-note {{'a' declared here}}
   ^{return a.x;}(); // expected-error {{cannot refer to declaration of structure variable with flexible array member inside block}}
+  [] {return a.x;}(); // expected-error {{variable 'a' with flexible array member cannot be captured in a lambda expression}}
 }