re PR middle-end/26092 (ICE on const function pointer assigned to a builtin function)

PR middle-end/26092
	* gimplify.c (gimplify_call_expr): Don't call get_callee_fndecl
	twice if decl is a builtin.  When trying again, call get_callee_fndecl
	first to verify it is still a builtin.

	* gcc.c-torture/compile/20060208-1.c: New test.

From-SVN: r110927
This commit is contained in:
Jakub Jelinek 2006-02-13 22:28:03 +01:00 committed by Jakub Jelinek
parent 2ed8d2241e
commit 6f538523d1
4 changed files with 37 additions and 13 deletions

View File

@ -1,3 +1,10 @@
2006-02-13 Jakub Jelinek <jakub@redhat.com>
PR middle-end/26092
* gimplify.c (gimplify_call_expr): Don't call get_callee_fndecl
twice if decl is a builtin. When trying again, call get_callee_fndecl
first to verify it is still a builtin.
2006-02-13 Geoffrey Keating <geoffk@apple.com>
* dwarf2out.c (base_type_die): Don't add AT_name here.

View File

@ -1970,9 +1970,8 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
decl = get_callee_fndecl (*expr_p);
if (decl && DECL_BUILT_IN (decl))
{
tree fndecl = get_callee_fndecl (*expr_p);
tree arglist = TREE_OPERAND (*expr_p, 1);
tree new = fold_builtin (fndecl, arglist, !want_value);
tree new = fold_builtin (decl, arglist, !want_value);
if (new && new != *expr_p)
{
@ -2026,19 +2025,22 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
/* Try this again in case gimplification exposed something. */
if (ret != GS_ERROR && decl && DECL_BUILT_IN (decl))
if (ret != GS_ERROR)
{
tree fndecl = get_callee_fndecl (*expr_p);
tree arglist = TREE_OPERAND (*expr_p, 1);
tree new = fold_builtin (fndecl, arglist, !want_value);
if (new && new != *expr_p)
decl = get_callee_fndecl (*expr_p);
if (decl && DECL_BUILT_IN (decl))
{
/* There was a transformation of this call which computes the
same value, but in a more efficient way. Return and try
again. */
*expr_p = new;
return GS_OK;
tree arglist = TREE_OPERAND (*expr_p, 1);
tree new = fold_builtin (decl, arglist, !want_value);
if (new && new != *expr_p)
{
/* There was a transformation of this call which computes the
same value, but in a more efficient way. Return and try
again. */
*expr_p = new;
return GS_OK;
}
}
}

View File

@ -1,3 +1,8 @@
2006-02-13 Jakub Jelinek <jakub@redhat.com>
PR middle-end/26092
* gcc.c-torture/compile/20060208-1.c: New test.
2006-02-13 Paul Thomas <pault@gcc.gnu.org>
PR fortran/26074

View File

@ -0,0 +1,10 @@
/* PR middle-end/26092 */
typedef __SIZE_TYPE__ size_t;
extern void *malloc (size_t);
void *(*const foo) (size_t) = malloc;
void *test (void)
{
return (*foo) (3);
}