PR c++/79500 - ICE with non-template deduction guide
authorJason Merrill <jason@redhat.com>
Mon, 20 Feb 2017 06:05:31 +0000 (01:05 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 20 Feb 2017 06:05:31 +0000 (01:05 -0500)
* pt.c (do_class_deduction): Use STRIP_TEMPLATE rather than
DECL_TEMPLATE_RESULT.

From-SVN: r245588

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

index 79fee99c4f389cf96bd805361924467e46785a2b..ee222b43e0ddb1e0362e3cbc72100403e2a48d47 100644 (file)
@@ -1,5 +1,9 @@
 2017-02-19  Jason Merrill  <jason@redhat.com>
 
+       PR c++/79500 - ICE with non-template deduction guide
+       * pt.c (do_class_deduction): Use STRIP_TEMPLATE rather than
+       DECL_TEMPLATE_RESULT.
+
        PR c++/79580 - ICE with compound literal
        * parser.c (cp_parser_class_head): If we're in the middle of an
        expression, use ts_within_enclosing_non_class.
index 9e6ce8d51def88cb54b50ba95f5714432956d90c..46e64986491552fec4b4531a43a3bf7b5cdacb83 100644 (file)
@@ -25118,7 +25118,7 @@ do_class_deduction (tree ptype, tree tmpl, tree init, int flags,
     {
       tree t = cands;
       for (; t; t = OVL_NEXT (t))
-       if (DECL_NONCONVERTING_P (DECL_TEMPLATE_RESULT (OVL_CURRENT (t))))
+       if (DECL_NONCONVERTING_P (STRIP_TEMPLATE (OVL_CURRENT (t))))
          break;
       if (t)
        {
@@ -25126,7 +25126,7 @@ do_class_deduction (tree ptype, tree tmpl, tree init, int flags,
          for (t = cands; t; t = OVL_NEXT (t))
            {
              tree f = OVL_CURRENT (t);
-             if (!DECL_NONCONVERTING_P (DECL_TEMPLATE_RESULT (f)))
+             if (!DECL_NONCONVERTING_P (STRIP_TEMPLATE (f)))
                pruned = build_overload (f, pruned);
            }
          cands = pruned;
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction29.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction29.C
new file mode 100644 (file)
index 0000000..efffe3d
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/79500
+// { dg-options -std=c++1z }
+
+template<typename T> struct A {};
+A(...) -> A<int>;
+A a = {};