PR c++/79556 - C++17 ICE with non-type auto
authorJason Merrill <jason@redhat.com>
Fri, 17 Feb 2017 18:42:37 +0000 (13:42 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 17 Feb 2017 18:42:37 +0000 (13:42 -0500)
* pt.c (do_auto_deduction): Don't try to deduce from null type.

From-SVN: r245543

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

index a1e49484c6510e090f2e4dc46ae792449ee73b2d..65f2d19eda0d16014d29d1d81546edb0952f13e0 100644 (file)
@@ -1,5 +1,8 @@
 2017-02-17  Jason Merrill  <jason@redhat.com>
 
+       PR c++/79556 - C++17 ICE with non-type auto
+       * pt.c (do_auto_deduction): Don't try to deduce from null type.
+
        PR c++/79533 - C++17 ICE with temporary cast to reference
        * call.c (build_over_call): Conversion to a reference prevents copy
        elision.
index 73d6be3598ff6f32a462ebdb927863b58bbef583..093c0f9377567a71b7e69194c42a450e88ba310a 100644 (file)
@@ -25191,6 +25191,10 @@ do_auto_deduction (tree type, tree init, tree auto_node,
     /* C++17 class template argument deduction.  */
     return do_class_deduction (type, tmpl, init, flags, complain);
 
+  if (TREE_TYPE (init) == NULL_TREE)
+    /* Nothing we can do with this, even in deduction context.  */
+    return type;
+
   /* [dcl.spec.auto]: Obtain P from T by replacing the occurrences of auto
      with either a new invented type template parameter U or, if the
      initializer is a braced-init-list (8.5.4), with
diff --git a/gcc/testsuite/g++.dg/cpp1z/nontype-auto9.C b/gcc/testsuite/g++.dg/cpp1z/nontype-auto9.C
new file mode 100644 (file)
index 0000000..2daa346
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/79556
+// { dg-options -std=c++1z }
+
+template <auto> struct A;
+template <auto...> struct B;
+template <int N, auto Dim, auto... Dims> struct B<N, Dim, Dims...> {
+  static auto a = A<B<Dims...>::value>::value;
+};