aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c3
-rw-r--r--gcc/testsuite/g++.dg/template/partial-specialization5.C22
3 files changed, 31 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 90272d2..13d7d33 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2017-02-21 Jason Merrill <jason@redhat.com>
+
+ PR c++/41727 - ICE with partial spec of partial instantiation
+ * pt.c (process_partial_specialization): For now, don't check more
+ specialized if there is more than one level of args.
+
2017-02-21 Marek Polacek <polacek@redhat.com>
PR c++/79535
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index c29e691..38a01e1 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4619,6 +4619,9 @@ process_partial_specialization (tree decl)
/* If we aren't in a dependent class, we can actually try deduction. */
else if (tpd.level == 1
+ /* FIXME we should be able to handle a partial specialization of a
+ partial instantiation, but currently we can't (c++/41727). */
+ && TMPL_ARGS_DEPTH (specargs) == 1
&& !get_partial_spec_bindings (maintmpl, maintmpl, specargs))
{
if (permerror (input_location, "partial specialization %qD is not "
diff --git a/gcc/testsuite/g++.dg/template/partial-specialization5.C b/gcc/testsuite/g++.dg/template/partial-specialization5.C
new file mode 100644
index 0000000..7a8db5a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/partial-specialization5.C
@@ -0,0 +1,22 @@
+// PR c++/41727
+
+struct tag0;
+
+template < class Tag > struct outer
+{
+ template < typename Arg0, typename Arg1 > struct inner;
+};
+
+template < int Value > struct value_wrap { };
+
+template </* class Tag */>
+template < typename Arg0, int Arg1 >
+struct outer <tag0 >::inner < Arg0, value_wrap < Arg1 > >
+{
+ typedef Arg0 type;
+};
+
+typedef outer < tag0 >
+::inner < tag0, value_wrap < 999 > >
+::type // { dg-bogus "incomplete" "" { xfail *-*-* } }
+ outer_inner_type;