re PR c++/77914 (Wrong lambda definition accepted)
authorJakub Jelinek <jakub@redhat.com>
Wed, 25 Jan 2017 20:51:10 +0000 (21:51 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 25 Jan 2017 20:51:10 +0000 (21:51 +0100)
PR c++/77914
* parser.c (cp_parser_lambda_declarator_opt): Pedwarn with
OPT_Wpedantic on lambda templates for -std=c++14 and higher.

* g++.dg/cpp1y/lambda-generic-77914.C: New test.
* g++.dg/cpp1y/lambda-generic-dep.C: Add -pedantic to dg-options,
expect a warning.
* g++.dg/cpp1y/lambda-generic-x.C: Add -Wpedantic to dg-options,
expect warnings.
* g++.dg/cpp1y/lambda-generic-mixed.C: Add empty dg-options.
* g++.dg/cpp1y/pr59636.C: Likewise.
* g++.dg/cpp1y/pr60190.C: Likewise.

From-SVN: r244907

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C
gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C
gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C
gcc/testsuite/g++.dg/cpp1y/pr59636.C
gcc/testsuite/g++.dg/cpp1y/pr60190.C

index 47eaa55032fb0d155a8b193fbaf6441071a828e3..dc098b2a723b76bf780731b4cc7b9986f3c50695 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/77914
+       * parser.c (cp_parser_lambda_declarator_opt): Pedwarn with
+       OPT_Wpedantic on lambda templates for -std=c++14 and higher.
+
 2017-01-25  Maxim Ostapenko  <m.ostapenko@samsung.com>
 
        PR lto/79061
index 4ab0b6974d624a791c69ad33671ee5f5a0791612..372a01e147a3fa5ab6d1ccf1caa89801aab85119 100644 (file)
@@ -10174,6 +10174,9 @@ 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
+       pedwarn (parser->lexer->next_token->location, OPT_Wpedantic,
+                "ISO C++ does not support lambda templates");
 
       cp_lexer_consume_token (parser->lexer);
 
index 9deb57de7e3f219c87b6b33a5c1f8eeda73a986e..e82fb4c94555e899d838ee092fd0269813506766 100644 (file)
@@ -1,3 +1,15 @@
+2017-01-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/77914
+       * g++.dg/cpp1y/lambda-generic-77914.C: New test.
+       * g++.dg/cpp1y/lambda-generic-dep.C: Add -pedantic to dg-options,
+       expect a warning.
+       * g++.dg/cpp1y/lambda-generic-x.C: Add -Wpedantic to dg-options,
+       expect warnings.
+       * g++.dg/cpp1y/lambda-generic-mixed.C: Add empty dg-options.
+       * g++.dg/cpp1y/pr59636.C: Likewise.
+       * g++.dg/cpp1y/pr60190.C: Likewise.
+
 2017-01-25  Bin Cheng  <bin.cheng@arm.com>
 
        * gcc.dg/vect/vect-24.c: Remove xfail on ARM targets.
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C
new file mode 100644 (file)
index 0000000..d069c33
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/77914
+// { dg-do compile { target c++14 } }
+
+int
+main ()
+{
+  auto l = [] <typename T> () {};      // { dg-error "does not support lambda templates" }
+  l.operator () <void> ();
+}
index dbf8b70f862a76f6c775dad7ee7520d4613e1eb5..c66d393d6b4e21f3fa61ddca58267a1341af0c58 100644 (file)
@@ -1,5 +1,6 @@
 // Generic lambda type dependence test part from N3690 5.1.2.12
 // { dg-do compile { target c++14 } }
+// { dg-options "-pedantic" }
 
 void f(int, const int (&)[2] = {}) { } // #1
 void f(const int&, const int (&)[1]) { } // #2
@@ -26,7 +27,7 @@ struct S {
 
 int main()
 {
-  auto f = [] <typename T> (T const& s) mutable {
+  auto f = [] <typename T> (T const& s) mutable {      // { dg-warning "does not support lambda templates" }
     typename T::N x;
     return x.test ();
   };
index 59b5ccaa957bd87b84fd33392434dc855cf2a5c4..aa9682478199b00bdad858b8c7ac0d6c268906f2 100644 (file)
@@ -1,5 +1,6 @@
 // Mixed explicit and implicit generic lambda test.
 // { dg-do compile { target c++14 } }
+// { dg-options "" }
 
 int main()
 {
index 5334091ef5f0e2e30d02b97698faebaf21d939d5..b37a6147526ac60a86a94dea110ca3374a6421f5 100644 (file)
@@ -1,21 +1,22 @@
 // Explicit generic lambda test from N3690 5.1.2.5
 // { dg-do compile { target c++14 } }
+// { dg-options "-Wpedantic" }
 
 #include <iostream>
 
 int main()
 {
-   auto glambda = [] <typename A, typename B> (A a, B&& b) { return a < b; };
+   auto glambda = [] <typename A, typename B> (A a, B&& b) { return a < b; };  // { dg-warning "does not support lambda templates" }
    bool b = glambda(3, 3.14); // OK
-   auto vglambda = [] <typename P> (P printer) {
+   auto vglambda = [] <typename P> (P printer) {                               // { dg-warning "does not support lambda templates" }
      return [=] <typename... T> (T&& ... ts) { // OK: ts is a function parameter pack
-       printer(std::forward<decltype(ts)>(ts)...);
+       printer(std::forward<decltype(ts)>(ts)...);                             // { dg-warning "does not support lambda templates" "" { target *-*-* } .-1 }
        return [=]() {
          printer(ts ...);
        };
      };
    };
-   auto p = vglambda( [] <typename A,
+   auto p = vglambda( [] <typename A,                                          // { dg-warning "does not support lambda templates" }
                           typename B,
                           typename C> (A v1, B v2, C v3)
      { std::cout << v1 << v2 << v3; } );
index 847cecdf5a5b9bc85d1d7d7c0ede5105a47eef0e..271491ee23cdabf3577b714e6e547f0ec7dcc8fc 100644 (file)
@@ -1,4 +1,5 @@
 // PR c++/59636
 // { dg-do compile { target c++14 } }
+// { dg-options "" }
 
 auto f = []() { return []<>() {}; };  // { dg-error "expected identifier" }
index 9e439ceb9eae6fa2f1b3b7b411451e89e9cf0014..f2d1bbf61126661275dd65769f65c1ca77c3d1df 100644 (file)
@@ -1,4 +1,5 @@
 // PR c++/60190
 // { dg-do compile { target c++14 } }
+// { dg-options "" }
 
 auto f = []<int>() -> int() {}; // { dg-error "returning a function|expected" }