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 <ja...@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