diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ad0ffcc443ee50acd120f9bfaeedb768ddb977bc..81feb213caa58d5e1ca7a109462cb5bc6f3380b5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2008-01-17 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/34556 + * simplify.c (is_constant_array_expr): New static function that returns + true if the given expression is an array and is constant. + (gfc_simplify_reshape): Use new function. + 2008-01-17 H.J. Lu <hongjiu.lu@intel.com> PR fortran/33375 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 85d74a5e13a039c09f0c5da3c79528d1cadac5b2..12be1e08222254faeee1cafde0c52be1f6e4c2f4 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -3164,6 +3164,30 @@ gfc_simplify_repeat (gfc_expr *e, gfc_expr *n) } +/* Test that the expression is an constant array. */ + +static bool +is_constant_array_expr (gfc_expr *e) +{ + gfc_constructor *c; + + if (e == NULL) + return true; + + if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e)) + return false; + + if (e->value.constructor == NULL) + return false; + + for (c = e->value.constructor; c; c = c->next) + if (c->expr->expr_type != EXPR_CONSTANT) + return false; + + return true; +} + + /* This one is a bear, but mainly has to do with shuffling elements. */ gfc_expr * @@ -3178,22 +3202,21 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp, size_t nsource; gfc_expr *e; - /* Unpack the shape array. */ - if (source->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (source)) + /* Check that argument expression types are OK. */ + if (!is_constant_array_expr (source)) return NULL; - if (shape_exp->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (shape_exp)) + if (!is_constant_array_expr (shape_exp)) return NULL; - if (pad != NULL - && (pad->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (pad))) + if (!is_constant_array_expr (pad)) return NULL; - if (order_exp != NULL - && (order_exp->expr_type != EXPR_ARRAY - || !gfc_is_constant_expr (order_exp))) + if (!is_constant_array_expr (order_exp)) return NULL; + /* Proceed with simplification, unpacking the array. */ + mpz_init (index); rank = 0; head = tail = NULL;