mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-24 10:19:16 +08:00
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:
parent
2ed8d2241e
commit
6f538523d1
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
10
gcc/testsuite/gcc.c-torture/compile/20060208-1.c
Normal file
10
gcc/testsuite/gcc.c-torture/compile/20060208-1.c
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user