re PR c++/56095 (Crash casting function pointer as non-type template argument)
authorJason Merrill <jason@redhat.com>
Sun, 17 Mar 2013 02:33:38 +0000 (22:33 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 17 Mar 2013 02:33:38 +0000 (22:33 -0400)
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.

From-SVN: r196722

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/pt.c

index a80043b..8aa3952 100644 (file)
@@ -1,3 +1,12 @@
+2013-03-16  Jason Merrill  <jason@redhat.com>
+
+       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.
+
 2013-03-16  Jakub Jelinek  <jakub@redhat.com>
 
        * tree.c (cp_tree_equal): Fix a pasto.
index 746c29d..b48b353 100644 (file)
@@ -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;
        }
     }
index eb9fc7f..36175ca 100644 (file)
@@ -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;