PR c++/79294 - ICE with invalid template argument
authorJason Merrill <jason@redhat.com>
Fri, 3 Feb 2017 19:44:21 +0000 (14:44 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 3 Feb 2017 19:44:21 +0000 (14:44 -0500)
* pt.c (convert_nontype_argument_function): Check value-dependence.
(convert_nontype_argument): Don't check it here for function ptrs.

From-SVN: r245168

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

index 96136af87eb282b284af2b54f8f5e25a6be6293c..8f65db5b357637634fa136423d3afd3ffd4e2412 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-03  Jason Merrill  <jason@redhat.com>
+
+       PR c++/79294 - ICE with invalid template argument
+       * pt.c (convert_nontype_argument_function): Check value-dependence.
+       (convert_nontype_argument): Don't check it here for function ptrs.
+
 2017-02-02  Richard Biener  <rguenther@suse.de>
 
        PR cp/14179
index c69c27063e86a62d54637ad33f4b1d7aeeb3a069..4c4941a88aa43103cca91d11ddf5c20d76fa67ec 100644 (file)
@@ -5966,6 +5966,9 @@ convert_nontype_argument_function (tree type, tree expr,
   if (fn == error_mark_node)
     return error_mark_node;
 
+  if (value_dependent_expression_p (fn))
+    return fn;
+
   fn_no_ptr = strip_fnptr_conv (fn);
   if (TREE_CODE (fn_no_ptr) == ADDR_EXPR)
     fn_no_ptr = TREE_OPERAND (fn_no_ptr, 0);
@@ -6698,8 +6701,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
        /* Null pointer values are OK in C++11.  */
        return perform_qualification_conversions (type, expr);
 
-      if (!value_dependent_expression_p (expr))
-       expr = convert_nontype_argument_function (type, expr, complain);
+      expr = convert_nontype_argument_function (type, expr, complain);
       if (!expr || expr == error_mark_node)
        return expr;
     }
@@ -6723,8 +6725,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
          return NULL_TREE;
        }
 
-      if (!value_dependent_expression_p (expr))
-       expr = convert_nontype_argument_function (type, expr, complain);
+      expr = convert_nontype_argument_function (type, expr, complain);
       if (!expr || expr == error_mark_node)
        return expr;
     }
diff --git a/gcc/testsuite/g++.dg/template/error57.C b/gcc/testsuite/g++.dg/template/error57.C
new file mode 100644 (file)
index 0000000..f67e0a6
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/79294
+
+template <int()> struct a;
+template <int(b)> a < b                // { dg-error "int" }
+// { dg-error "expected" "" { target *-*-* } .-1 }