diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-11-21 09:39:57 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-11-21 09:39:57 +0100 |
commit | 7768f20b0a08f8f735de9f4088945023cce0230b (patch) | |
tree | 601806c349966938a25cfaa78cf75d7cac6770b5 /gcc | |
parent | d44ed508a66686e0c2fdf48f4cd4a9ad8a1b0547 (diff) | |
download | gcc-7768f20b0a08f8f735de9f4088945023cce0230b.zip gcc-7768f20b0a08f8f735de9f4088945023cce0230b.tar.gz gcc-7768f20b0a08f8f735de9f4088945023cce0230b.tar.bz2 |
P0428R2 - familiar template syntax for generic lambdas
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/lambda-generic1.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/lambda-generic2.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/lambda-generic3.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/lambda-generic4.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/lambda-generic5.C | 6 |
11 files changed, 65 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 56d466d..db94034 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 8280769..b061704 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05638e7..3901db4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C index d069c33..a57903a 100644 --- a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C @@ -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> (); } diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C index c66d393..982a155 100644 --- a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C @@ -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 (); }; diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C index b37a614..0926a5e 100644 --- a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C @@ -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 index 0000000..9f6304b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-generic1.C @@ -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 index 0000000..6116639 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-generic2.C @@ -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 index 0000000..b0d525e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-generic3.C @@ -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 index 0000000..393e852 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-generic4.C @@ -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 index 0000000..e608e95 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-generic5.C @@ -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 } |