This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C++ PATCH] P0428R2 - familiar template syntax for generic lambdas


Hi!

This feature seems to be fully implemented from what I can see, except that we
pedwarn on it, which we shouldn't do for -std=c++2a or -std=gnu++2a when it is
standard.

I'm not really sure about the pedwarn wording(s), the reality is that
it is supported for C++14 and later as an extension and for C++2A and later
as standard feature.

Regtested on x86_64-linux with check-c++-all.

2017-11-10  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.

	* 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.

--- gcc/cp/parser.c.jj	2017-11-01 22:49:15.000000000 +0100
+++ gcc/cp/parser.c	2017-11-10 13:21:16.475915963 +0100
@@ -10510,9 +10510,10 @@ cp_parser_lambda_declarator_opt (cp_pars
 	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);
 
--- gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C.jj	2017-01-25 21:50:13.000000000 +0100
+++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C	2017-11-10 13:25:29.113922954 +0100
@@ -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; } );
--- gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C.jj	2017-01-25 21:50:13.000000000 +0100
+++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C	2017-11-10 13:23:47.218130116 +0100
@@ -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 ();
   };
--- gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C.jj	2017-01-25 21:50:13.000000000 +0100
+++ gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C	2017-11-10 13:23:32.644302773 +0100
@@ -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> ();
 }
--- gcc/testsuite/g++.dg/cpp2a/lambda-generic1.C.jj	2017-11-10 13:26:08.666448084 +0100
+++ gcc/testsuite/g++.dg/cpp2a/lambda-generic1.C	2017-11-10 13:29:03.518348714 +0100
@@ -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 } }

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]