diff options
author | Daniel Franke <franke.daniel@gmail.com> | 2010-05-05 14:53:23 -0400 |
---|---|---|
committer | Daniel Franke <dfranke@gcc.gnu.org> | 2010-05-05 14:53:23 -0400 |
commit | e5880243049fd9d3992c86eb2f929abd3514153c (patch) | |
tree | 24a5a6c449684bf4a2c0701c5f668e03bd7fa60f /gcc/fortran/trans-array.c | |
parent | 5b042919f71728bc26a8921738bdb0a1b3c680f0 (diff) | |
download | gcc-e5880243049fd9d3992c86eb2f929abd3514153c.zip gcc-e5880243049fd9d3992c86eb2f929abd3514153c.tar.gz gcc-e5880243049fd9d3992c86eb2f929abd3514153c.tar.bz2 |
re PR fortran/24978 (ICE in gfc_assign_data_value_range)
gcc/fortran/:
2010-05-05 Daniel Franke <franke.daniel@gmail.com>
PR fortran/24978
* gfortran.h: Removed repeat count from constructor, removed
all usages.
* data.h (gfc_assign_data_value_range): Changed return value from
void to gfc_try.
* data.c (gfc_assign_data_value): Add location to constructor element.
(gfc_assign_data_value_range): Call gfc_assign_data_value()
for each element in range. Return early if an error was generated.
* resolve.c (check_data_variable): Stop early if range assignment
generated an error.
gcc/testsuite/:
2010-05-05 Daniel Franke <franke.daniel@gmail.com>
PR fortran/24978
* gfortran.dg/data_invalid.f90: New.
From-SVN: r159076
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 43 |
1 files changed, 3 insertions, 40 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index e20406c..8ece643 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -4133,11 +4133,10 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) { gfc_constructor *c; tree tmp; - mpz_t maxval; gfc_se se; HOST_WIDE_INT hi; unsigned HOST_WIDE_INT lo; - tree index, range; + tree index; VEC(constructor_elt,gc) *v = NULL; switch (expr->expr_type) @@ -4190,42 +4189,13 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) index = gfc_conv_mpz_to_tree (c->offset, gfc_index_integer_kind); else index = NULL_TREE; - mpz_init (maxval); - if (mpz_cmp_si (c->repeat, 0) != 0) - { - tree tmp1, tmp2; - - mpz_set (maxval, c->repeat); - mpz_add (maxval, c->offset, maxval); - mpz_sub_ui (maxval, maxval, 1); - tmp2 = gfc_conv_mpz_to_tree (maxval, gfc_index_integer_kind); - if (mpz_cmp_si (c->offset, 0) != 0) - { - mpz_add_ui (maxval, c->offset, 1); - tmp1 = gfc_conv_mpz_to_tree (maxval, gfc_index_integer_kind); - } - else - tmp1 = gfc_conv_mpz_to_tree (c->offset, gfc_index_integer_kind); - - range = fold_build2 (RANGE_EXPR, integer_type_node, tmp1, tmp2); - } - else - range = NULL; - mpz_clear (maxval); gfc_init_se (&se, NULL); switch (c->expr->expr_type) { case EXPR_CONSTANT: gfc_conv_constant (&se, c->expr); - if (range == NULL_TREE) - CONSTRUCTOR_APPEND_ELT (v, index, se.expr); - else - { - if (index != NULL_TREE) - CONSTRUCTOR_APPEND_ELT (v, index, se.expr); - CONSTRUCTOR_APPEND_ELT (v, range, se.expr); - } + CONSTRUCTOR_APPEND_ELT (v, index, se.expr); break; case EXPR_STRUCTURE: @@ -4239,14 +4209,7 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) for one reason or another, assuming that if they are standard defying the frontend will catch them. */ gfc_conv_expr (&se, c->expr); - if (range == NULL_TREE) - CONSTRUCTOR_APPEND_ELT (v, index, se.expr); - else - { - if (index != NULL_TREE) - CONSTRUCTOR_APPEND_ELT (v, index, se.expr); - CONSTRUCTOR_APPEND_ELT (v, range, se.expr); - } + CONSTRUCTOR_APPEND_ELT (v, index, se.expr); break; } } |