re PR c++/18672 (Segfault with simple template code)
.: PR c++/18672 * gimplify.c (canonicalize_addr_expr): Cope with array of incomplete type. (gimplify_conversion): Remove redundant checks. testsuite: PR c++/18672 * g++.dg/opt/array1.C: New. From-SVN: r91865
This commit is contained in:
parent
e6aef96964
commit
0710ccffc3
|
@ -1,5 +1,10 @@
|
||||||
2004-12-08 Nathan Sidwell <nathan@codesourcery.com>
|
2004-12-08 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
PR c++/18672
|
||||||
|
* gimplify.c (canonicalize_addr_expr): Cope with array of
|
||||||
|
incomplete type.
|
||||||
|
(gimplify_conversion): Remove redundant checks.
|
||||||
|
|
||||||
* doc/trouble.texi (Non-bugs): Clarify empty loop removal.
|
* doc/trouble.texi (Non-bugs): Clarify empty loop removal.
|
||||||
|
|
||||||
2004-12-08 Uros Bizjak <uros@kss-loka.si>
|
2004-12-08 Uros Bizjak <uros@kss-loka.si>
|
||||||
|
|
|
@ -1336,7 +1336,8 @@ canonicalize_addr_expr (tree *expr_p)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* The lower bound and element sizes must be constant. */
|
/* The lower bound and element sizes must be constant. */
|
||||||
if (TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
|
if (!TYPE_SIZE_UNIT (dctype)
|
||||||
|
|| TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
|
||||||
|| !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
|
|| !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
|
||||||
|| TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
|
|| TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
|
||||||
return;
|
return;
|
||||||
|
@ -1356,16 +1357,15 @@ canonicalize_addr_expr (tree *expr_p)
|
||||||
static enum gimplify_status
|
static enum gimplify_status
|
||||||
gimplify_conversion (tree *expr_p)
|
gimplify_conversion (tree *expr_p)
|
||||||
{
|
{
|
||||||
/* If we still have a conversion at the toplevel, then strip
|
gcc_assert (TREE_CODE (*expr_p) == NOP_EXPR
|
||||||
away all but the outermost conversion. */
|
|| TREE_CODE (*expr_p) == CONVERT_EXPR);
|
||||||
if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
|
|
||||||
{
|
/* Then strip away all but the outermost conversion. */
|
||||||
STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
|
STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
|
||||||
|
|
||||||
/* And remove the outermost conversion if it's useless. */
|
/* And remove the outermost conversion if it's useless. */
|
||||||
if (tree_ssa_useless_type_conversion (*expr_p))
|
if (tree_ssa_useless_type_conversion (*expr_p))
|
||||||
*expr_p = TREE_OPERAND (*expr_p, 0);
|
*expr_p = TREE_OPERAND (*expr_p, 0);
|
||||||
}
|
|
||||||
|
|
||||||
/* If we still have a conversion at the toplevel,
|
/* If we still have a conversion at the toplevel,
|
||||||
then canonicalize some constructs. */
|
then canonicalize some constructs. */
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
2004-12-08 Nathan Sidwell <nathan@codesourcery.com>
|
2004-12-08 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
PR c++/18672
|
||||||
|
* g++.dg/opt/array1.C: New.
|
||||||
|
|
||||||
PR c++/18803
|
PR c++/18803
|
||||||
* g++.dg/template/operator5.C: New.
|
* g++.dg/template/operator5.C: New.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright (C) 2004 Free Software Foundation, Inc.
|
||||||
|
// Contributed by Nathan Sidwell 29 Nov 2004 <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
// PR 18672:ICE gimplifying incomplete array type.
|
||||||
|
// Origin: Magnus Fromreide <gcc@magfr.user.lysator.liu.se>
|
||||||
|
|
||||||
|
struct A;
|
||||||
|
|
||||||
|
struct D {
|
||||||
|
static A ary[];
|
||||||
|
};
|
||||||
|
extern A ary[];
|
||||||
|
|
||||||
|
void Foo (A const *);
|
||||||
|
|
||||||
|
void Bar ()
|
||||||
|
{
|
||||||
|
Foo (D::ary);
|
||||||
|
Foo (::ary);
|
||||||
|
}
|
Loading…
Reference in New Issue