aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-06-28 15:59:37 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-06-28 15:59:37 -0400
commitd778c63739f59f83f47973a4f02a7f86ac74a3e7 (patch)
treea017454878c6c49eca286f93ad15a7444b9c5517 /gcc
parent4516a545864a489d573c4c3aca498edd849899ad (diff)
downloadgcc-d778c63739f59f83f47973a4f02a7f86ac74a3e7.zip
gcc-d778c63739f59f83f47973a4f02a7f86ac74a3e7.tar.gz
gcc-d778c63739f59f83f47973a4f02a7f86ac74a3e7.tar.bz2
PR c++/72801 - ICE with variadic partial specialization
* pt.c (unify_pack_expansion): Use PACK_EXPANSION_EXTRA_ARGS. From-SVN: r249755
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/pt.c3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic-partial1.C22
3 files changed, 28 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f4b93ca..ae6de7f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2017-06-28 Jason Merrill <jason@redhat.com>
+ PR c++/72801 - ICE with variadic partial specialization
+ * pt.c (unify_pack_expansion): Use PACK_EXPANSION_EXTRA_ARGS.
+
PR c++/55639 - partial specialization with ::template
* parser.c (cp_parser_class_head): Handle ::template.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index b060a19..b86b346 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -20044,6 +20044,9 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
tree pack, packs = NULL_TREE;
int i, start = TREE_VEC_LENGTH (packed_parms) - 1;
+ /* Add in any args remembered from an earlier partial instantiation. */
+ targs = add_to_template_args (PACK_EXPANSION_EXTRA_ARGS (parm), targs);
+
packed_args = expand_template_argument_pack (packed_args);
int len = TREE_VEC_LENGTH (packed_args);
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-partial1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-partial1.C
new file mode 100644
index 0000000..6f8df3e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic-partial1.C
@@ -0,0 +1,22 @@
+// PR c++/72801
+// { dg-do compile { target c++11 } }
+
+template < typename, typename > struct A {};
+
+template < typename ... T > struct B
+{
+ template < typename > struct C
+ {
+ static const int a = 0;
+ };
+
+ template < typename R, typename ... S >
+ struct C < R (A < T, S > ...) >
+ {
+ static const int a = 1;
+ };
+};
+
+#define SA(X) static_assert ((X), #X)
+SA(B <>::C<int()>::a == 1);
+