aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRyan Burn <contact@rnburn.com>2015-11-19 18:25:38 +0000
committerJason Merrill <jason@gcc.gnu.org>2015-11-19 13:25:38 -0500
commit0398c18360a7b4a4024b1cc0fee3e3fcb9293e09 (patch)
tree5545a521a76bfa949a8dad755acf2c5c815513e2 /gcc
parent498cb3c3200161be080af98733be859294cd439b (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/pt.c14
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr68396.C15
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> ();
+}