P0428R2 - familiar template syntax for generic lambdas
authorJakub Jelinek <jakub@redhat.com>
Tue, 21 Nov 2017 08:39:57 +0000 (09:39 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 21 Nov 2017 08:39:57 +0000 (09:39 +0100)
P0428R2 - familiar template syntax for generic lambdas
* parser.c (cp_parser_lambda_declarator_opt): Don't pedwarn
for cxx2a and above, reword pedwarn for C++14/C++17.

* g++.dg/cpp1y/lambda-generic-x.C: Adjust warnings and limit
to c++17_down target.
* g++.dg/cpp1y/lambda-generic-dep.C: Likewise.
* g++.dg/cpp1y/lambda-generic-77914.C: Adjust error and limit
to c++17_down target.
* g++.dg/cpp2a/lambda-generic1.C: New test.
* g++.dg/cpp2a/lambda-generic2.C: New test.
* g++.dg/cpp2a/lambda-generic3.C: New test.
* g++.dg/cpp2a/lambda-generic4.C: New test.
* g++.dg/cpp2a/lambda-generic5.C: New test.

From-SVN: r254991

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C
gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C
gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C
gcc/testsuite/g++.dg/cpp2a/lambda-generic1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/lambda-generic2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/lambda-generic3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/lambda-generic4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/lambda-generic5.C [new file with mode: 0644]

index 56d466dfb4c58570a8357d0fc16bf5c4e03e2801..db9403455c474a0b21fb1c4daf9cf9a521552cac 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-21  Jakub Jelinek  <jakub@redhat.com>
+
+       P0428R2 - familiar template syntax for generic lambdas
+       * parser.c (cp_parser_lambda_declarator_opt): Don't pedwarn
+       for cxx2a and above, reword pedwarn for C++14/C++17.
+
 2017-11-20  David Malcolm  <dmalcolm@redhat.com>
 
        PR c/81404
index 82807690c88c30cb89c98ac6ce945b9e1e1a524a..b06170482097740901ce8dac6103a08ec0a7bb31 100644 (file)
@@ -10512,9 +10512,10 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
        pedwarn (parser->lexer->next_token->location, 0,
                 "lambda templates are only available with "
                 "-std=c++14 or -std=gnu++14");
-      else
+      else if (cxx_dialect < cxx2a)
        pedwarn (parser->lexer->next_token->location, OPT_Wpedantic,
-                "ISO C++ does not support lambda templates");
+                "lambda templates are only available with "
+                "-std=c++2a or -std=gnu++2a");
 
       cp_lexer_consume_token (parser->lexer);
 
index 05638e790dcf329378ab4ce1720055a0dbd39e88..3901db4b4b891edd37d5b60caf82da5485cc4161 100644 (file)
@@ -1,5 +1,17 @@
 2017-11-21  Jakub Jelinek  <jakub@redhat.com>
 
+       P0428R2 - familiar template syntax for generic lambdas
+       * g++.dg/cpp1y/lambda-generic-x.C: Adjust warnings and limit
+       to c++17_down target.
+       * g++.dg/cpp1y/lambda-generic-dep.C: Likewise.
+       * g++.dg/cpp1y/lambda-generic-77914.C: Adjust error and limit
+       to c++17_down target.
+       * g++.dg/cpp2a/lambda-generic1.C: New test.
+       * g++.dg/cpp2a/lambda-generic2.C: New test.
+       * g++.dg/cpp2a/lambda-generic3.C: New test.
+       * g++.dg/cpp2a/lambda-generic4.C: New test.
+       * g++.dg/cpp2a/lambda-generic5.C: New test.
+
        PR c++/83059
        * c-c++-common/pr83059.c: New test.
 
index d069c33c93d1baa4e4168621581ed08e39e10460..a57903aba3350425463eba6b12e9439710451b27 100644 (file)
@@ -4,6 +4,6 @@
 int
 main ()
 {
-  auto l = [] <typename T> () {};      // { dg-error "does not support lambda templates" }
+  auto l = [] <typename T> () {};      // { dg-error "lambda templates are only available with" "" { target c++17_down } }
   l.operator () <void> ();
 }
index c66d393d6b4e21f3fa61ddca58267a1341af0c58..982a155e777b7987e193d186794d92073d44a394 100644 (file)
@@ -27,7 +27,7 @@ struct S {
 
 int main()
 {
-  auto f = [] <typename T> (T const& s) mutable {      // { dg-warning "does not support lambda templates" }
+  auto f = [] <typename T> (T const& s) mutable {      // { dg-warning "lambda templates are only available with" "" { target c++17_down } }
     typename T::N x;
     return x.test ();
   };
index b37a6147526ac60a86a94dea110ca3374a6421f5..0926a5e363b81acdd2570e9409c77f15ba328641 100644 (file)
@@ -6,17 +6,17 @@
 
 int main()
 {
-   auto glambda = [] <typename A, typename B> (A a, B&& b) { return a < b; };  // { dg-warning "does not support lambda templates" }
+   auto glambda = [] <typename A, typename B> (A a, B&& b) { return a < b; };  // { dg-warning "lambda templates are only available with" "" { target c++17_down } }
    bool b = glambda(3, 3.14); // OK
-   auto vglambda = [] <typename P> (P printer) {                               // { dg-warning "does not support lambda templates" }
+   auto vglambda = [] <typename P> (P printer) {                               // { dg-warning "lambda templates are only available with" "" { target c++17_down } }
      return [=] <typename... T> (T&& ... ts) { // OK: ts is a function parameter pack
-       printer(std::forward<decltype(ts)>(ts)...);                             // { dg-warning "does not support lambda templates" "" { target *-*-* } .-1 }
+       printer(std::forward<decltype(ts)>(ts)...);                             // { dg-warning "lambda templates are only available with" "" { target c++17_down } .-1 }
        return [=]() {
          printer(ts ...);
        };
      };
    };
-   auto p = vglambda( [] <typename A,                                          // { dg-warning "does not support lambda templates" }
+   auto p = vglambda( [] <typename A,                                          // { dg-warning "lambda templates are only available with" "" { target c++17_down } }
                           typename B,
                           typename C> (A v1, B v2, C v3)
      { std::cout << v1 << v2 << v3; } );
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-generic1.C b/gcc/testsuite/g++.dg/cpp2a/lambda-generic1.C
new file mode 100644 (file)
index 0000000..9f6304b
--- /dev/null
@@ -0,0 +1,9 @@
+// P0428R2
+// { dg-do compile { target c++14 } }
+
+int i = [](int i, auto a) { return i; }(3, 4);
+int j = []<class T>(T t, int i) { return i; }(3, 4);             // { dg-error "lambda templates are only available with" "" { target c++17_down } }
+int k[2] = { 5, 6 };
+int l = []<typename T>(T *p) { return *p; }(k);                          // { dg-error "lambda templates are only available with" "" { target c++17_down } }
+int m = []<typename T, int N>(T (&a)[N]) { return a[N - 1]; }(k); // { dg-error "lambda templates are only available with" "" { target c++17_down } }
+int n = []<typename T>(T a, auto b) { return a + b; }(7, 8);     // { dg-error "lambda templates are only available with" "" { target c++17_down } }
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-generic2.C b/gcc/testsuite/g++.dg/cpp2a/lambda-generic2.C
new file mode 100644 (file)
index 0000000..6116639
--- /dev/null
@@ -0,0 +1,7 @@
+// P0428R2
+// { dg-do compile }
+
+int j = []<class T>(T t, int i) { return i; }(3, 4);
+// { dg-error "lambda templates are only available with" "" { target c++17_down } .-1 }
+// { dg-error "lambda expressions only available with" "" { target c++98_only } .-2 }
+// { dg-error "invalid use of 'auto'" "" { target c++98_only } .-3 }
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-generic3.C b/gcc/testsuite/g++.dg/cpp2a/lambda-generic3.C
new file mode 100644 (file)
index 0000000..b0d525e
--- /dev/null
@@ -0,0 +1,8 @@
+// P0428R2
+// { dg-do compile }
+// { dg-options "-Wpedantic" }
+
+int j = []<class T>(T t, int i) { return i; }(3, 4);
+// { dg-warning "lambda templates are only available with" "" { target c++17_down } .-1 }
+// { dg-warning "lambda expressions only available with" "" { target c++98_only } .-2 }
+// { dg-error "invalid use of 'auto'" "" { target c++98_only } .-3 }
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-generic4.C b/gcc/testsuite/g++.dg/cpp2a/lambda-generic4.C
new file mode 100644 (file)
index 0000000..393e852
--- /dev/null
@@ -0,0 +1,8 @@
+// P0428R2
+// { dg-do compile }
+// { dg-options "-Wno-pedantic" }
+
+int j = []<class T>(T t, int i) { return i; }(3, 4);
+// { dg-warning "lambda templates are only available with" "" { target c++11_down } .-1 }
+// { dg-warning "lambda expressions only available with" "" { target c++98_only } .-2 }
+// { dg-error "invalid use of 'auto'" "" { target c++98_only } .-3 }
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-generic5.C b/gcc/testsuite/g++.dg/cpp2a/lambda-generic5.C
new file mode 100644 (file)
index 0000000..e608e95
--- /dev/null
@@ -0,0 +1,6 @@
+// P0428R2
+// { dg-do compile }
+// { dg-options "-std=c++2a" }
+
+int j = []<class T>(T t, int i) { return i; }(3, 4);
+// { dg-bogus "lambda templates are only available with" "" { target c++2a } .-1 }