aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorEdward Smith-Rowland <3dw4rd@verizon.net>2014-07-25 22:35:24 +0000
committerEdward Smith-Rowland <emsr@gcc.gnu.org>2014-07-25 22:35:24 +0000
commit37545fa7226bfa3aa72244dd119a9a82ed26d077 (patch)
treeefcf15526658a36e2836301e944f391c42dd576a /gcc/testsuite
parenta634323ae02c99a5a7e2b7c9674109ed2af6c969 (diff)
downloadgcc-37545fa7226bfa3aa72244dd119a9a82ed26d077.zip
gcc-37545fa7226bfa3aa72244dd119a9a82ed26d077.tar.gz
gcc-37545fa7226bfa3aa72244dd119a9a82ed26d077.tar.bz2
Implement N4051 - Allow typename in a template template parameter
cp/ 2014-07-25 Edward Smith-Rowland <3dw4rd@verizon.net> Implement N4051 - Allow typename in a template template parameter * parser.c (cp_parser_type_parameter_key): New funtion; (cp_parser_token_is_type_parameter_key): Ditto; (cp_parser_type_parameter): Look for type-parameter-key for all versions but pedwarn for less than cxx1z. testsuite/ 2014-07-25 Edward Smith-Rowland <3dw4rd@verizon.net> Implement N4051 - Allow typename in a template template parameter * lib/target-supports.exp (check_effective_target_c++1y): Now means C++1y and up. (check_effective_target_c++1y_down): New. (check_effective_target_c++1z_only): New. (check_effective_target_c++1z): New. * g++.dg/cpp1z/typename-tmpl-tmpl-parm.C: New. * g++.dg/cpp1z/typename-tmpl-tmpl-parm-neg.C: New. * g++.dg/cpp1z/typename-tmpl-tmpl-parm-.C: New. From-SVN: r213065
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-neg.C11
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-ped-neg.C28
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm.C28
-rw-r--r--gcc/testsuite/lib/target-supports.exp21
5 files changed, 99 insertions, 1 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ebf7bad..92d1f96 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,15 @@
+2014-07-25 Edward Smith-Rowland <3dw4rd@verizon.net>
+
+ Implement N4051 - Allow typename in a template template parameter
+ * lib/target-supports.exp (check_effective_target_c++1y): Now
+ means C++1y and up.
+ (check_effective_target_c++1y_down): New.
+ (check_effective_target_c++1z_only): New.
+ (check_effective_target_c++1z): New.
+ * g++.dg/cpp1z/typename-tmpl-tmpl-parm.C: New.
+ * g++.dg/cpp1z/typename-tmpl-tmpl-parm-neg.C: New.
+ * g++.dg/cpp1z/typename-tmpl-tmpl-parm-.C: New.
+
2014-07-25 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/storage_size_5.f90: New.
diff --git a/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-neg.C b/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-neg.C
new file mode 100644
index 0000000..29c699d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-neg.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "" }
+
+template<template<typename> struct X> // { dg-error "expected .class. or .typename. before" }
+ struct D {};
+
+template<template<typename> X> // { dg-error "expected .class. or .typename. before" }
+ struct E {};
+
+// { dg-error "expected identifier" "expected" { target *-*-* } 4 }
+// { dg-error "expected .>." "expected" { target *-*-* } 4 }
diff --git a/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-ped-neg.C b/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-ped-neg.C
new file mode 100644
index 0000000..48cb8ab
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-ped-neg.C
@@ -0,0 +1,28 @@
+// { dg-do compile { target c++1y_down } }
+// { dg-options "-pedantic" }
+
+template<typename T>
+ struct A {};
+
+#if __cplusplus >= 201103L
+template<typename T>
+ using B = int;
+#endif
+
+template<template<typename> class X>
+ struct C {};
+
+C<A> ca;
+
+#if __cplusplus >= 201103L
+C<B> cb;
+#endif
+
+template<template<typename> typename X> // { dg-warning "ISO C.. forbids typename key in template template parameter" }
+ struct D {};
+
+D<A> da;
+
+#if __cplusplus >= 201103L
+D<B> db;
+#endif
diff --git a/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm.C b/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm.C
new file mode 100644
index 0000000..4c3eae1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+// { dg-options "" }
+
+template<typename T>
+ struct A {};
+
+#if __cplusplus >= 201103L
+template<typename T>
+ using B = int;
+#endif
+
+template<template<typename> class X>
+ struct C {};
+
+C<A> ca;
+
+#if __cplusplus >= 201103L
+C<B> cb;
+#endif
+
+template<template<typename> typename X>
+ struct D {};
+
+D<A> da;
+
+#if __cplusplus >= 201103L
+D<B> db;
+#endif
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index ade3cad..fa5137e 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -5707,7 +5707,16 @@ proc check_effective_target_c++1y_only { } {
return [check-flags { { } { } { -std=c++1y -std=gnu++1y -std=c++14 -std=gnu++14 } }]
}
proc check_effective_target_c++1y { } {
- return [check_effective_target_c++1y_only]
+ if [check_effective_target_c++1y_only] {
+ return 1
+ }
+ return [check_effective_target_c++1z]
+}
+proc check_effective_target_c++1y_down { } {
+ if ![check_effective_target_c++] {
+ return 0
+ }
+ return ![check_effective_target_c++1z]
}
proc check_effective_target_c++98_only { } {
@@ -5717,6 +5726,16 @@ proc check_effective_target_c++98_only { } {
return ![check_effective_target_c++11]
}
+proc check_effective_target_c++1z_only { } {
+ if ![check_effective_target_c++] {
+ return 0
+ }
+ return [check-flags { { } { } { -std=c++1z -std=gnu++1z } }]
+}
+proc check_effective_target_c++1z { } {
+ return [check_effective_target_c++1z_only]
+}
+
# Return 1 if expensive testcases should be run.
proc check_effective_target_run_expensive_tests { } {