aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-11-21 09:39:57 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-11-21 09:39:57 +0100
commit7768f20b0a08f8f735de9f4088945023cce0230b (patch)
tree601806c349966938a25cfaa78cf75d7cac6770b5 /gcc
parentd44ed508a66686e0c2fdf48f4cd4a9ad8a1b0547 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-77914.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C8
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/lambda-generic1.C9
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/lambda-generic2.C7
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/lambda-generic3.C8
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/lambda-generic4.C8
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/lambda-generic5.C6
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 }