diff options
author | Ryan Burn <contact@rnburn.com> | 2015-11-19 18:25:38 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-11-19 13:25:38 -0500 |
commit | 0398c18360a7b4a4024b1cc0fee3e3fcb9293e09 (patch) | |
tree | 5545a521a76bfa949a8dad755acf2c5c815513e2 /gcc | |
parent | 498cb3c3200161be080af98733be859294cd439b (diff) | |
download | gcc-0398c18360a7b4a4024b1cc0fee3e3fcb9293e09.zip gcc-0398c18360a7b4a4024b1cc0fee3e3fcb9293e09.tar.gz gcc-0398c18360a7b4a4024b1cc0fee3e3fcb9293e09.tar.bz2 |
re PR c++/68396 (function auto-deduced return types get incorrectly classified as parameter packs)
PR c++/68396
2015-11-19 Ryan Burn <contact@rnburn.com>
* pt.c (find_parameter_packs_r) [DECLTYPE_TYPE]: When traversing
the DECLTYPE_TYPE_EXPR, set type_pack_expansion_p to false.
From-SVN: r230620
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/pr68396.C | 15 |
3 files changed, 35 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 024290c..d7804a0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-11-19 Ryan Burn <contact@rnburn.com> + + PR c++/68396 + * pt.c (find_parameter_packs_r) [DECLTYPE_TYPE]: When traversing + the DECLTYPE_TYPE_EXPR, set type_pack_expansion_p to false. + 2015-11-19 Cesar Philippidis <cesar@codesourcery.com> * parser.h (struct cp_omp_declare_simd_data): Add clauses member. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2904657..b4a5e71 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3551,6 +3551,20 @@ find_parameter_packs_r (tree *tp, int *walk_subtrees, void* data) *walk_subtrees = 0; return NULL_TREE; + case DECLTYPE_TYPE: + { + /* When traversing a DECLTYPE_TYPE_EXPR, we need to set + type_pack_expansion_p to false so that any placeholders + within the expression don't get marked as parameter packs. */ + bool type_pack_expansion_p = ppd->type_pack_expansion_p; + ppd->type_pack_expansion_p = false; + cp_walk_tree (&DECLTYPE_TYPE_EXPR (t), &find_parameter_packs_r, + ppd, ppd->visited); + ppd->type_pack_expansion_p = type_pack_expansion_p; + *walk_subtrees = 0; + return NULL_TREE; + } + default: return NULL_TREE; } diff --git a/gcc/testsuite/g++.dg/cpp1y/pr68396.C b/gcc/testsuite/g++.dg/cpp1y/pr68396.C new file mode 100644 index 0000000..2027d6e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr68396.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++14 } } + +template <unsigned> +auto f () { + return 2; +} + +template <class> +class A {}; + +template <int... Ix> +auto g () { + A<decltype(f<Ix> ())...>(); + return f<2> (); +} |