PR c++/80356 - ICE with reference to function template argument.
authorJason Merrill <jason@redhat.com>
Sun, 9 Apr 2017 05:38:40 +0000 (01:38 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 9 Apr 2017 05:38:40 +0000 (01:38 -0400)
PR c++/79294
* pt.c (convert_nontype_argument_function): Adjust type even with a
value-dependent argument.

From-SVN: r246794

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

index e980456918e7d0fab61122c5a78aef8c874aff37..ee8de4c3f8a5c4b41df22800dabf11c29334c799 100644 (file)
@@ -1,5 +1,10 @@
 2017-04-07  Jason Merrill  <jason@redhat.com>
 
+       PR c++/80356 - ICE with reference to function template argument.
+       PR c++/79294
+       * pt.c (convert_nontype_argument_function): Adjust type even with a
+       value-dependent argument.
+
        PR c++/80267 - ICE with nested capture of reference
        PR c++/60992
        * pt.c (tsubst_copy): Handle lookup finding a capture proxy.
index 2d1e81fffd1a67cba1787db6d35bae4e96347617..5a55f179096f7f1eaab4392e86e3f16abc300444 100644 (file)
@@ -5981,7 +5981,7 @@ convert_nontype_argument_function (tree type, tree expr,
     return error_mark_node;
 
   if (value_dependent_expression_p (fn))
-    return fn;
+    goto accept;
 
   fn_no_ptr = strip_fnptr_conv (fn);
   if (TREE_CODE (fn_no_ptr) == ADDR_EXPR)
@@ -6030,6 +6030,7 @@ convert_nontype_argument_function (tree type, tree expr,
       return NULL_TREE;
     }
 
+ accept:
   if (TREE_CODE (type) == REFERENCE_TYPE)
     fn = build_address (fn);
   if (!same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (fn)))
diff --git a/gcc/testsuite/g++.dg/template/fn-ref1.C b/gcc/testsuite/g++.dg/template/fn-ref1.C
new file mode 100644 (file)
index 0000000..b2c4429
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/80356
+
+template <int (&)(int, int)> struct a;
+template <int (&b)(int, int)> a<b> f();