PR c++/80096 - ICE with C++17 non-type auto.
authorJason Merrill <jason@redhat.com>
Mon, 20 Mar 2017 20:36:54 +0000 (16:36 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 20 Mar 2017 20:36:54 +0000 (16:36 -0400)
* pt.c (tsubst): Delay tsubst of type of template non-type
parameter.

From-SVN: r246292

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

index 428e07c..7dfa577 100644 (file)
@@ -1,5 +1,9 @@
 2017-03-20  Jason Merrill  <jason@redhat.com>
 
+       PR c++/80096 - ICE with C++17 non-type auto.
+       * pt.c (tsubst): Delay tsubst of type of template non-type
+       parameter.
+
        PR c++/79519 - ICE with deleted template friend.
        * decl.c (grokdeclarator): Complain about misplaced function
        definition using =, as well.
index f180710..a4bf890 100644 (file)
@@ -13388,6 +13388,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
   if (type
       && code != TYPENAME_TYPE
       && code != TEMPLATE_TYPE_PARM
+      && code != TEMPLATE_PARM_INDEX
       && code != IDENTIFIER_NODE
       && code != FUNCTION_TYPE
       && code != METHOD_TYPE)
@@ -13690,6 +13691,10 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
            break;
 
          case TEMPLATE_PARM_INDEX:
+           /* OK, now substitute the type of the non-type parameter.  We
+              couldn't do it earlier because it might be an auto parameter,
+              and we wouldn't need to if we had an argument.  */
+           type = tsubst (type, args, complain, in_decl);
            r = reduce_template_parm_level (t, type, levels, args, complain);
            break;
 
diff --git a/gcc/testsuite/g++.dg/cpp1z/nontype-auto10.C b/gcc/testsuite/g++.dg/cpp1z/nontype-auto10.C
new file mode 100644 (file)
index 0000000..381ed51
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/80096
+// { dg-options -std=c++1z }
+
+template<auto> struct A
+{
+  template<int> struct B {};
+};
+
+A<0> a;