PR c++/41727 - ICE with partial spec of partial instantiation
authorJason Merrill <jason@redhat.com>
Tue, 21 Feb 2017 20:50:57 +0000 (15:50 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 21 Feb 2017 20:50:57 +0000 (15:50 -0500)
* pt.c (process_partial_specialization): For now, don't check more
specialized if there is more than one level of args.

From-SVN: r245642

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/partial-specialization5.C [new file with mode: 0644]

index 90272d2638edb44699ff91eca87ed80ceb4add94..13d7d33b8c3cf0861a082114b107b30a31d73528 100644 (file)
@@ -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
index c29e691b44c75547560f4244cf66f6d342ca4a1f..38a01e168a7876ce9b7c0ccc51786aa4f44fe8bf 100644 (file)
@@ -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 (file)
index 0000000..7a8db5a
--- /dev/null
@@ -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;