From 0710ccffc3ddf8e4877fdab6cf712cd65f45d1cb Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 8 Dec 2004 08:47:59 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/gimplify.c | 20 ++++++++++---------- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/opt/array1.C | 20 ++++++++++++++++++++ 4 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/array1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1579cb3a996..c6b3059d0c3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2004-12-08 Nathan Sidwell + 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. 2004-12-08 Uros Bizjak diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 41814a7fddf..0b83d78fd43 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1336,7 +1336,8 @@ canonicalize_addr_expr (tree *expr_p) return; /* 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)) || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST) return; @@ -1356,16 +1357,15 @@ canonicalize_addr_expr (tree *expr_p) static enum gimplify_status gimplify_conversion (tree *expr_p) { - /* If we still have a conversion at the toplevel, then strip - away all but the outermost conversion. */ - if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR) - { - STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0)); + gcc_assert (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)); - /* And remove the outermost conversion if it's useless. */ - if (tree_ssa_useless_type_conversion (*expr_p)) - *expr_p = TREE_OPERAND (*expr_p, 0); - } + /* And remove the outermost conversion if it's useless. */ + if (tree_ssa_useless_type_conversion (*expr_p)) + *expr_p = TREE_OPERAND (*expr_p, 0); /* If we still have a conversion at the toplevel, then canonicalize some constructs. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eac55dfa82d..05276095c7e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2004-12-08 Nathan Sidwell + PR c++/18672 + * g++.dg/opt/array1.C: New. + PR c++/18803 * g++.dg/template/operator5.C: New. diff --git a/gcc/testsuite/g++.dg/opt/array1.C b/gcc/testsuite/g++.dg/opt/array1.C new file mode 100644 index 00000000000..c63ed22c88b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/array1.C @@ -0,0 +1,20 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Nov 2004 + +// PR 18672:ICE gimplifying incomplete array type. +// Origin: Magnus Fromreide + +struct A; + +struct D { + static A ary[]; +}; +extern A ary[]; + +void Foo (A const *); + +void Bar () +{ + Foo (D::ary); + Foo (::ary); +}