re PR middle-end/52888 (Unable to inline function pointer call with inexact signature match)

2012-04-10  Richard Guenther  <rguenther@suse.de>

	PR middle-end/52888
	* gimple-low.c (gimple_check_call_args): Properly account for
	compatible aggregate types.

From-SVN: r186276
This commit is contained in:
Richard Guenther 2012-04-10 13:20:50 +00:00 committed by Richard Biener
parent 0878843fd5
commit e30459d52b
2 changed files with 16 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2012-04-10 Richard Guenther <rguenther@suse.de>
PR middle-end/52888
* gimple-low.c (gimple_check_call_args): Properly account for
compatible aggregate types.
2012-04-10 Richard Guenther <rguenther@suse.de>
* toplev.h (tree_rest_of_compilation): Remove.

View File

@ -240,15 +240,17 @@ gimple_check_call_args (gimple stmt, tree fndecl)
i < nargs;
i++, p = DECL_CHAIN (p))
{
tree arg;
/* We cannot distinguish a varargs function from the case
of excess parameters, still deferring the inlining decision
to the callee is possible. */
if (!p)
break;
arg = gimple_call_arg (stmt, i);
if (p == error_mark_node
|| gimple_call_arg (stmt, i) == error_mark_node
|| !fold_convertible_p (DECL_ARG_TYPE (p),
gimple_call_arg (stmt, i)))
|| arg == error_mark_node
|| (!types_compatible_p (DECL_ARG_TYPE (p), TREE_TYPE (arg))
&& !fold_convertible_p (DECL_ARG_TYPE (p), arg)))
return false;
}
}
@ -256,15 +258,17 @@ gimple_check_call_args (gimple stmt, tree fndecl)
{
for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
{
tree arg;
/* If this is a varargs function defer inlining decision
to callee. */
if (!p)
break;
arg = gimple_call_arg (stmt, i);
if (TREE_VALUE (p) == error_mark_node
|| gimple_call_arg (stmt, i) == error_mark_node
|| arg == error_mark_node
|| TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
|| !fold_convertible_p (TREE_VALUE (p),
gimple_call_arg (stmt, i)))
|| (!types_compatible_p (TREE_VALUE (p), TREE_TYPE (arg))
&& !fold_convertible_p (TREE_VALUE (p), arg)))
return false;
}
}