re PR c++/78701 (ICE: unexpected expression N of kind template_parm_index)
authorNathan Sidwell <nathan@acm.org>
Wed, 14 Dec 2016 16:45:33 +0000 (16:45 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 14 Dec 2016 16:45:33 +0000 (16:45 +0000)
PR c++/78701
* pt.c (type_unification_real): Check tsubst arg doesn't have
remaining template parms before converting it.

PR c++/78701
* g++.dg/cpp0x/pr78701.C: New.

From-SVN: r243657

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr78701.C [new file with mode: 0644]

index 3404e88ed6189429a18e30274e72872e6b407e47..4061bedab8b93030a9321fa1135e0df7023c4ad3 100644 (file)
@@ -1,5 +1,9 @@
 2016-12-14  Nathan Sidwell  <nathan@acm.org>
 
+       PR c++/78701
+       * pt.c (type_unification_real): Check tsubst arg doesn't have
+       remaining template parms before converting it.
+
        PR c++/69481
        * cp-tree.h (TYPE_TEMPLATE_INFO_MAYBE_ALIAS): Always use
        TYPE_ALIAS_TEMPLATE_INFO for aliases.
index bae96ec9d220477f8e41e1dcd206bf95498b0739..a45e99cc59659df191533602c8fa07beedc6b57e 100644 (file)
@@ -18991,14 +18991,19 @@ type_unification_real (tree tparms,
          if (DECL_P (parm))
            input_location = DECL_SOURCE_LOCATION (parm);
          arg = tsubst_template_arg (arg, full_targs, complain, NULL_TREE);
-         arg = convert_template_argument (parm, arg, full_targs, complain,
-                                          i, NULL_TREE);
+         if (!uses_template_parms (arg))
+           arg = convert_template_argument (parm, arg, full_targs, complain,
+                                            i, NULL_TREE);
+         else if (saw_undeduced < 2)
+           arg = NULL_TREE;
+         else
+           arg = error_mark_node;
          input_location = save_loc;
          *checks = get_deferred_access_checks ();
          pop_deferring_access_checks ();
          if (arg == error_mark_node)
            return 1;
-         else
+         else if (arg)
            {
              TREE_VEC_ELT (targs, i) = arg;
              /* The position of the first default template argument,
@@ -19006,7 +19011,6 @@ type_unification_real (tree tparms,
                 Record that.  */
              if (!NON_DEFAULT_TEMPLATE_ARGS_COUNT (targs))
                SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (targs, i);
-             continue;
            }
        }
 
index 9f7fa7e43c72fe0af193d316fa5c6be53a28b816..47a98ac1a017d87a30b2ad9c14598244dfb66020 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-14  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/78701
+       * g++.dg/cpp0x/pr78701.C: New.
+
 2016-12-14  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * gcc/testsuite/gcc.target/powerpc/vec-extract.h: If DO_TRACE is
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr78701.C b/gcc/testsuite/g++.dg/cpp0x/pr78701.C
new file mode 100644 (file)
index 0000000..6fef926
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/58707
+// { dg-do compile { target c++11 } }
+
+// ICE during deduction of default parms
+
+template <class T, T N = T(), bool B = N>
+  void f(T x) {}
+
+template void f<int> (int);