diff options
author | Edward Smith-Rowland <3dw4rd@verizon.net> | 2014-07-25 22:35:24 +0000 |
---|---|---|
committer | Edward Smith-Rowland <emsr@gcc.gnu.org> | 2014-07-25 22:35:24 +0000 |
commit | 37545fa7226bfa3aa72244dd119a9a82ed26d077 (patch) | |
tree | efcf15526658a36e2836301e944f391c42dd576a /gcc/testsuite | |
parent | a634323ae02c99a5a7e2b7c9674109ed2af6c969 (diff) | |
download | gcc-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/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-neg.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm-ped-neg.C | 28 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/typename-tmpl-tmpl-parm.C | 28 | ||||
-rw-r--r-- | gcc/testsuite/lib/target-supports.exp | 21 |
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 { } { |