diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1995-05-12 18:31:57 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1995-05-12 18:31:57 -0400 |
commit | 36427b78add2e9f6b5a479319bae80b0387835bd (patch) | |
tree | aeb86d521519ea147ee57f10d508fccbc5869220 /gcc | |
parent | 74a35b2b7d4acd85a5c08c0b52cbe479bbed7167 (diff) | |
download | gcc-36427b78add2e9f6b5a479319bae80b0387835bd.zip gcc-36427b78add2e9f6b5a479319bae80b0387835bd.tar.gz gcc-36427b78add2e9f6b5a479319bae80b0387835bd.tar.bz2 |
(layout_type...
(layout_type, case ARRAY_TYPE): Compute length using MAX of length and
zero if sizetype signed and neither bound constant.
From-SVN: r9668
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/stor-layout.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 669a1de..e37c8df 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -1,5 +1,5 @@ /* C-compiler utilities for types and variables storage layout - Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright (C) 1987, 88, 92, 93, 94, 1995 Free Software Foundation, Inc. This file is part of GNU CC. @@ -740,6 +740,15 @@ layout_type (type) size_binop (MINUS_EXPR, TYPE_MAX_VALUE (index), TYPE_MIN_VALUE (index))); + /* If neither bound is a constant and sizetype is signed, make + sure the size is never negative. We should really do this + if *either* bound is non-constant, but this is the best + compromise between C and Ada. */ + if (! TREE_UNSIGNED (sizetype) + && TREE_CODE (TYPE_MIN_VALUE (index)) != INTEGER_CST + && TREE_CODE (TYPE_MAX_VALUE (index)) != INTEGER_CST) + length = size_binop (MAX_EXPR, length, size_zero_node); + TYPE_SIZE (type) = size_binop (MULT_EXPR, length, TYPE_SIZE (element)); } |