Patchwork C++ PATCH for c++/56095 (ICE on invalid function pointer template argument)

login
register
mail settings
Submitter Jason Merrill
Date March 16, 2013, 6:28 p.m.
Message ID <5144B9E8.6030603@redhat.com>
Download mbox | patch
Permalink /patch/228235/
State New
Headers show

Comments

Jason Merrill - March 16, 2013, 6:28 p.m.
While I was looking at this issue in January, I noticed that 
resolve_address_of_overloaded_function wasn't accepting a reference to 
function type, which it seems like it ought to handle.

Tested x86_64-pc-linux-gnu, applying to trunk.

Patch

commit 9839aa98a3c80c73e904b657499e6fce7d43a25d
Author: Jason Merrill <jason@redhat.com>
Date:   Fri Jan 25 14:27:48 2013 -0500

    	PR c++/56095
    	* class.c (resolve_address_of_overloaded_function): Accept a
    	reference to function for target_type.
    	(instantiate_type): Likewise.
    	* pt.c (convert_nontype_argument): Pass it to
    	convert_nontype_argument_function.

diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 746c29d..b48b353 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -7148,7 +7148,8 @@  resolve_address_of_overloaded_function (tree target_type,
   gcc_assert (is_overloaded_fn (overload));
 
   /* Check that the TARGET_TYPE is reasonable.  */
-  if (TYPE_PTRFN_P (target_type))
+  if (TYPE_PTRFN_P (target_type)
+      || TYPE_REFFN_P (target_type))
     /* This is OK.  */;
   else if (TYPE_PTRMEMFUNC_P (target_type))
     /* This is OK, too.  */
@@ -7419,10 +7420,11 @@  instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags)
 
   if (TREE_TYPE (rhs) != NULL_TREE && ! (type_unknown_p (rhs)))
     {
-      if (same_type_p (lhstype, TREE_TYPE (rhs)))
+      tree fntype = non_reference (lhstype);
+      if (same_type_p (fntype, TREE_TYPE (rhs)))
 	return rhs;
       if (flag_ms_extensions
-	  && TYPE_PTRMEMFUNC_P (lhstype)
+	  && TYPE_PTRMEMFUNC_P (fntype)
 	  && !TYPE_PTRMEMFUNC_P (TREE_TYPE (rhs)))
 	/* Microsoft allows `A::f' to be resolved to a
 	   pointer-to-member.  */
@@ -7431,7 +7433,7 @@  instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags)
 	{
 	  if (flags & tf_error)
 	    error ("cannot convert %qE from type %qT to type %qT",
-		   rhs, TREE_TYPE (rhs), lhstype);
+		   rhs, TREE_TYPE (rhs), fntype);
 	  return error_mark_node;
 	}
     }
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index eb9fc7f..36175ca 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -5788,7 +5788,7 @@  convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
 	  return NULL_TREE;
 	}
 
-      expr = convert_nontype_argument_function (TREE_TYPE (type), expr);
+      expr = convert_nontype_argument_function (type, expr);
       if (!expr || expr == error_mark_node)
 	return expr;