PR c++/84937 - ICE with class deduction and auto.
authorJason Merrill <jason@redhat.com>
Tue, 20 Mar 2018 12:44:49 +0000 (08:44 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 20 Mar 2018 12:44:49 +0000 (08:44 -0400)
* pt.c (rewrite_template_parm): Fix auto handling.

From-SVN: r258680

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1z/class-deduction51.C [new file with mode: 0644]

index 236ea215452c0e5ef7a588cd4df94ac507bb30fc..fd7329f06222cd241f9832041b29ff34449a4596 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/84937 - ICE with class deduction and auto.
+       * pt.c (rewrite_template_parm): Fix auto handling.
+
 2018-03-19  Marek Polacek  <polacek@redhat.com>
 
        PR c++/84925
@@ -9,7 +14,7 @@
        (cxx_eval_constant_expression): Verify constructor's flags
        unconditionally.
 
-2018-03-16  Jason Merrill  <jason@redhat.com>
+2018-03-19  Jason Merrill  <jason@redhat.com>
 
        PR c++/71834 - template-id with too few arguments.
        * pt.c (coerce_template_parms): Check fixed_parameter_pack_p.
index 21a4de57745f60ff083b2e9c7f1a73577d4bf99b..d7c0c7bec81b11b89bc742de9b24f233f9204bf3 100644 (file)
@@ -25781,8 +25781,21 @@ rewrite_template_parm (tree olddecl, unsigned index, unsigned level,
          = TEMPLATE_TYPE_PARM_FOR_CLASS (oldtype);
     }
   else
-    newtype = tsubst (TREE_TYPE (olddecl), tsubst_args,
-                     complain, NULL_TREE);
+    {
+      newtype = TREE_TYPE (olddecl);
+      if (type_uses_auto (newtype))
+       {
+         // Substitute once to fix references to other template parameters.
+         newtype = tsubst (newtype, tsubst_args,
+                           complain|tf_partial, NULL_TREE);
+         // Now substitute again to reduce the level of the auto.
+         newtype = tsubst (newtype, current_template_args (),
+                           complain, NULL_TREE);
+       }
+      else
+       newtype = tsubst (newtype, tsubst_args,
+                         complain, NULL_TREE);
+    }
 
   tree newdecl
     = build_decl (DECL_SOURCE_LOCATION (olddecl), TREE_CODE (olddecl),
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction51.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction51.C
new file mode 100644 (file)
index 0000000..eba7972
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/84937
+// { dg-additional-options -std=c++17 }
+
+template<int, int> struct A {};
+
+template<int I> struct B
+{
+  template<auto J> B(A<I,J>);
+};
+
+B b(A<0,0>{});