Commit 6f538523 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 2ed8d224
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> 2006-02-13 Geoffrey Keating <geoffk@apple.com>
* dwarf2out.c (base_type_die): Don't add AT_name here. * dwarf2out.c (base_type_die): Don't add AT_name here.
......
...@@ -1970,9 +1970,8 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value) ...@@ -1970,9 +1970,8 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
decl = get_callee_fndecl (*expr_p); decl = get_callee_fndecl (*expr_p);
if (decl && DECL_BUILT_IN (decl)) if (decl && DECL_BUILT_IN (decl))
{ {
tree fndecl = get_callee_fndecl (*expr_p);
tree arglist = TREE_OPERAND (*expr_p, 1); 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) if (new && new != *expr_p)
{ {
...@@ -2026,19 +2025,22 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value) ...@@ -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)); TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
/* Try this again in case gimplification exposed something. */ /* 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); decl = get_callee_fndecl (*expr_p);
tree arglist = TREE_OPERAND (*expr_p, 1); if (decl && DECL_BUILT_IN (decl))
tree new = fold_builtin (fndecl, arglist, !want_value);
if (new && new != *expr_p)
{ {
/* There was a transformation of this call which computes the tree arglist = TREE_OPERAND (*expr_p, 1);
same value, but in a more efficient way. Return and try tree new = fold_builtin (decl, arglist, !want_value);
again. */
*expr_p = new; if (new && new != *expr_p)
return GS_OK; {
/* 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;
}
} }
} }
......
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> 2006-02-13 Paul Thomas <pault@gcc.gnu.org>
PR fortran/26074 PR fortran/26074
/* 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment