diff options
author | Joern Rennecke <joern.rennecke@embecosm.com> | 2013-07-04 22:20:34 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 2013-07-04 23:20:34 +0100 |
commit | 40d3d53015c20f58fff7e6b098d0c943d3aea2b0 (patch) | |
tree | 4559cbb5c6a77bed54dfc0e0b4f1a07ff09c382c /gcc/c-family | |
parent | 5fde62e29930ccf09c647c47db77894ff046b0ac (diff) | |
download | gcc-40d3d53015c20f58fff7e6b098d0c943d3aea2b0.zip gcc-40d3d53015c20f58fff7e6b098d0c943d3aea2b0.tar.gz gcc-40d3d53015c20f58fff7e6b098d0c943d3aea2b0.tar.bz2 |
re PR c/57821 ('array is too large' error is missing when sizetype overflows)
gcc/c:
PR c/57821
* c-typeck.c (set_init_index): When folding, check for index overflow.
gcc/c-family:
PR c/57821
* c-common.c (complete_array_type): Delay folding first index
like other indices. When folding, check for index overflow.
gcc/testsuite:
PR c/57821
* gcc.dg/large-size-array-6.c: New test.
From-SVN: r200683
Diffstat (limited to 'gcc/c-family')
-rw-r--r-- | gcc/c-family/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 24 |
2 files changed, 24 insertions, 6 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index c9a4f70..ec47ffb 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2013-07-04 Joern Rennecke <joern.rennecke@embecosm.com> + + PR c/57821 + * c-common.c (complete_array_type): Delay folding first index + like other indices. When folding, check for index overflow. + 2013-06-27 Marc Glisse <marc.glisse@inria.fr> PR c++/57509 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 8f7f5e5..61300cd 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -9781,6 +9781,7 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default) tree maxindex, type, main_type, elt, unqual_elt; int failure = 0, quals; hashval_t hashcode = 0; + bool overflow_p = false; maxindex = size_zero_node; if (initial_value) @@ -9809,8 +9810,8 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default) bool fold_p = false; if ((*v)[0].index) - maxindex = fold_convert_loc (input_location, sizetype, - (*v)[0].index); + maxindex = (*v)[0].index, fold_p = true; + curindex = maxindex; for (cnt = 1; vec_safe_iterate (v, cnt, &ce); cnt++) @@ -9821,15 +9822,26 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default) else { if (fold_p) - curindex = fold_convert (sizetype, curindex); + { + /* Since we treat size types now as ordinary + unsigned types, we need an explicit overflow + check. */ + tree orig = curindex; + curindex = fold_convert (sizetype, curindex); + overflow_p |= tree_int_cst_lt (curindex, orig); + } curindex = size_binop (PLUS_EXPR, curindex, size_one_node); } if (tree_int_cst_lt (maxindex, curindex)) maxindex = curindex, fold_p = curfold_p; } - if (fold_p) - maxindex = fold_convert (sizetype, maxindex); + if (fold_p) + { + tree orig = maxindex; + maxindex = fold_convert (sizetype, maxindex); + overflow_p |= tree_int_cst_lt (maxindex, orig); + } } } else @@ -9890,7 +9902,7 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default) if (COMPLETE_TYPE_P (type) && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST - && TREE_OVERFLOW (TYPE_SIZE_UNIT (type))) + && (overflow_p || TREE_OVERFLOW (TYPE_SIZE_UNIT (type)))) { error ("size of array is too large"); /* If we proceed with the array type as it is, we'll eventually |