aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-03-20 16:36:54 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-03-20 16:36:54 -0400
commit55b11c6090594d60e7a7d6ff348e36c50a4d6f27 (patch)
tree29be994555e93866fc5ce1615c37fce79f229e3d
parent18f73c5f243f55cab6413674ee7eb35db56932ad (diff)
downloadgcc-55b11c6090594d60e7a7d6ff348e36c50a4d6f27.zip
gcc-55b11c6090594d60e7a7d6ff348e36c50a4d6f27.tar.gz
gcc-55b11c6090594d60e7a7d6ff348e36c50a4d6f27.tar.bz2
PR c++/80096 - ICE with C++17 non-type auto.
* pt.c (tsubst): Delay tsubst of type of template non-type parameter. From-SVN: r246292
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/nontype-auto10.C9
3 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 428e07c..7dfa577 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index f180710..a4bf890 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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
index 0000000..381ed51
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/nontype-auto10.C
@@ -0,0 +1,9 @@
+// PR c++/80096
+// { dg-options -std=c++1z }
+
+template<auto> struct A
+{
+ template<int> struct B {};
+};
+
+A<0> a;