N3648
authorJason Merrill <jason@redhat.com>
Mon, 22 Apr 2013 19:19:55 +0000 (15:19 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 22 Apr 2013 19:19:55 +0000 (15:19 -0400)
* parser.c (cp_parser_lambda_introducer): Make lambda capture init
pedwarn unconditional except in C++1y mode.

From-SVN: r198156

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C [deleted file]
gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C [moved from gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext.C with 93% similarity]
gcc/testsuite/g++.dg/cpp1y/lambda-init.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-init1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-init2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-init3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-init4.C [new file with mode: 0644]

index dffab2c..34f207f 100644 (file)
@@ -1,5 +1,9 @@
 2013-04-22  Jason Merrill  <jason@redhat.com>
 
+       N3648
+       * parser.c (cp_parser_lambda_introducer): Make lambda capture init
+       pedwarn unconditional except in C++1y mode.
+
        * semantics.c (potential_constant_expression_1): Don't crash on
        'this' in NSDMI.
 
index 1893482..1fbc9bd 100644 (file)
@@ -8518,9 +8518,10 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
        {
          /* An explicit expression exists.  */
          cp_lexer_consume_token (parser->lexer);
-          pedwarn (input_location, OPT_Wpedantic,
-                   "ISO C++ does not allow initializers "
-                   "in lambda expression capture lists");
+         if (cxx_dialect < cxx1y)
+           pedwarn (input_location, 0,
+                    "lambda capture initializers "
+                    "only available with -std=c++1y or -std=gnu++1y");
          capture_init_expr = cp_parser_assignment_expression (parser,
                                                               /*cast_p=*/true,
                                                               &idk);
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C
deleted file mode 100644 (file)
index 03c94e9..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// Test for the explicit initializer extension
-// { dg-options "-std=c++0x" }
-
-int main()
-{
-  int j = [i = 2]{sizeof(i); return i;}();
-  return (j != 2);
-}
@@ -1,7 +1,7 @@
 // Testcase for an extension to allow return type deduction when the lambda
 // contains more than just a single return-statement.
 
-// { dg-options -std=c++0x }
+// { dg-options -std=c++1y }
 // { dg-do run }
 
 bool b;
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init.C
new file mode 100644 (file)
index 0000000..a443642
--- /dev/null
@@ -0,0 +1,8 @@
+// Test for the explicit initializer extension of C++1y
+// { dg-options "-std=c++1y" }
+
+int main()
+{
+  int j = [i = 2]{sizeof(i); return i;}();
+  return (j != 2);
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C
new file mode 100644 (file)
index 0000000..6411fca
--- /dev/null
@@ -0,0 +1,13 @@
+// N3648: capture init
+// { dg-options "-std=c++1y -w" }
+// { dg-do run }
+
+int main()
+{
+  int x = 41;
+  auto r = [x = x+1]{ return x; }();
+  if (r != 42) __builtin_abort();
+
+  static auto *p = &r;
+  [&x=r]{ if (&x != p) __builtin_abort(); }();
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C
new file mode 100644 (file)
index 0000000..068621d
--- /dev/null
@@ -0,0 +1,13 @@
+// N3648: redundancy and capture init
+// { dg-options "-std=c++1y -pedantic-errors" }
+
+int main()
+{
+  int x = 42;
+  [=,x]{};                     // { dg-error "redundant" }
+  [=,&x]{};
+  [&,&x]{};                    // { dg-error "redundant" }
+  [&,x]{};
+  [=,x=24]{};
+  [&,&r=x]{};
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C
new file mode 100644 (file)
index 0000000..9044be6
--- /dev/null
@@ -0,0 +1,11 @@
+// N3648: capture init at non-block scope
+// { dg-options "-std=c++1y -w" }
+// { dg-do run }
+
+int i = 42;
+int j = [x=i]{ return x; }();
+
+int main()
+{
+  if (j != 42) __builtin_abort();
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C
new file mode 100644 (file)
index 0000000..da4ea37
--- /dev/null
@@ -0,0 +1,14 @@
+// N3648: capture init example from paper
+// { dg-options "-std=c++1y" }
+// { dg-do run }
+
+int x = 4;
+auto y = [&r = x, x = x+1]()->int {
+  r += 2;
+  return x+2;
+}();  // Updates ::x to 6, and initializes y to 7.
+
+int main()
+{
+  if (x != 6 || y != 7) __builtin_abort();
+}