re PR middle-end/20739 (ICE in gimplify_addr_expr)

gcc/ChangeLog:
PR middle-end/20739
* gimplify.c (gimplify_addr_expr): Compensate for removal of
e.g. cv-qualification conversions.
gcc/testsuite/ChangeLog:
PR middle-end/20739
* gcc.dg/tree-ssa/pr20739.c: New test.

From-SVN: r98167
This commit is contained in:
Alexandre Oliva 2005-04-15 03:09:50 +00:00 committed by Alexandre Oliva
parent 03ae9e8858
commit c87ac7e8f7
4 changed files with 41 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2005-04-15 Alexandre Oliva <aoliva@redhat.com>
PR middle-end/20739
* gimplify.c (gimplify_addr_expr): Compensate for removal of
e.g. cv-qualification conversions.
2005-04-14 Mike Stump <mrs@apple.com>
* config/darwin-c.c (framework_construct_pathname): We must

View File

@ -3229,6 +3229,9 @@ gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
builtins like __builtin_va_end). */
/* Caution: the silent array decomposition semantics we allow for
ADDR_EXPR means we can't always discard the pair. */
/* Gimplification of the ADDR_EXPR operand may drop
cv-qualification conversions, so make sure we add them if
needed. */
{
tree op00 = TREE_OPERAND (op0, 0);
tree t_expr = TREE_TYPE (expr);
@ -3238,9 +3241,9 @@ gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
{
#ifdef ENABLE_CHECKING
tree t_op0 = TREE_TYPE (op0);
gcc_assert (TREE_CODE (t_op0) == ARRAY_TYPE
&& POINTER_TYPE_P (t_expr)
&& cpt_same_type (TREE_TYPE (t_op0),
gcc_assert (POINTER_TYPE_P (t_expr)
&& cpt_same_type (TREE_CODE (t_op0) == ARRAY_TYPE
? TREE_TYPE (t_op0) : t_op0,
TREE_TYPE (t_expr))
&& POINTER_TYPE_P (t_op00)
&& cpt_same_type (t_op0, TREE_TYPE (t_op00)));

View File

@ -1,3 +1,8 @@
2005-04-15 Alexandre Oliva <aoliva@redhat.com>
PR middle-end/20739
* gcc.dg/tree-ssa/pr20739.c: New test.
2005-04-14 Mike Stump <mrs@apple.com>
* gcc.dg/Foundation.framework/empty: New.

View File

@ -0,0 +1,24 @@
/* PR middle-end/20739 */
/* dg-do compile */
/* dg-options "-O" */
/* We used to fail to compile this because gimplification dropped the
conversion that added the const qualifier to the sub-expression
involving baz, and then immediately noticed and reported its
absence. */
typedef struct
{
char chars[5];
}
baz_t;
extern baz_t * baz;
extern void foo (baz_t);
int
bar (const baz_t * ls)
{
foo (ls == 0 ? *(&baz[0]) : *ls);
}