From 0398c18360a7b4a4024b1cc0fee3e3fcb9293e09 Mon Sep 17 00:00:00 2001 From: Ryan Burn Date: Thu, 19 Nov 2015 18:25:38 +0000 Subject: [PATCH] re PR c++/68396 (function auto-deduced return types get incorrectly classified as parameter packs) 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. From-SVN: r230620 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 14 ++++++++++++++ gcc/testsuite/g++.dg/cpp1y/pr68396.C | 15 +++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/pr68396.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 024290c16d0..d7804a0edae 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 29046572b2c..b4a5e71b521 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 00000000000..2027d6ef967 --- /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> (); +} -- 2.30.2