From: jason Date: Thu, 19 Nov 2015 18:25:38 +0000 (+0000) Subject: PR c++/68396 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce718fc8a697ff7d20960beb8ace10449c721967;p=thirdparty%2Fgcc.git PR c++/68396 2015-11-19 Ryan Burn * pt.c (find_parameter_packs_r) [DECLTYPE_TYPE]: When traversing the DECLTYPE_TYPE_EXPR, set type_pack_expansion_p to false. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230620 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 024290c16d04..d7804a0edae0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-11-19 Ryan Burn + + 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 * parser.h (struct cp_omp_declare_simd_data): Add clauses member. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 29046572b2cf..b4a5e71b521b 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 000000000000..2027d6ef967c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr68396.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++14 } } + +template +auto f () { + return 2; +} + +template +class A {}; + +template +auto g () { + A ())...>(); + return f<2> (); +}