https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95053
anlauf at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |REOPENED Resolution|FIXED |--- --- Comment #15 from anlauf at gcc dot gnu.org --- A possible workaround is to partly revert the offending commit and handle problematic cases individually. The original commit intended to handle two different ICEs with a common invalid code. Bill, can you try the following patch? (Note that this needs two adjustments in the testsuite, but otherwise regtests for me. I'm not 100%sure if the PDT part is correct.) diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c index dd72f44d377..dd7f5f43930 100644 --- a/gcc/fortran/arith.c +++ b/gcc/fortran/arith.c @@ -1806,7 +1806,7 @@ gfc_multiply (gfc_expr *op1, gfc_expr *op2) gfc_expr * gfc_divide (gfc_expr *op1, gfc_expr *op2) { - if (op2 && op2->expr_type == EXPR_CONSTANT) + if (0 && op2 && op2->expr_type == EXPR_CONSTANT) { arith rc = ARITH_OK; switch (op2->ts.type) diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index d650407da41..6866f460224 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -2602,6 +2602,14 @@ variable_decl (int elem) gfc_free_expr (e); } + if (not_constant && e->ts.type != BT_INTEGER) + { + gfc_error ("Explicit array shape at %C must be constant of " + "INTEGER type and not %s type", + gfc_basic_typename (e->ts.type)); + m = MATCH_ERROR; + goto cleanup; + } if (not_constant) { gfc_error ("Explicit shaped array with nonconstant bounds at %C"); @@ -3736,8 +3744,9 @@ gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym, if (kind_expr) { /* Try simplification even for LEN expressions. */ + bool ok; gfc_resolve_expr (kind_expr); - gfc_simplify_expr (kind_expr, 1); + ok = gfc_simplify_expr (kind_expr, 1); /* Variable expressions seem to default to BT_PROCEDURE. TODO find out why this is and fix it. */ if (kind_expr->ts.type != BT_INTEGER @@ -3748,6 +3757,12 @@ gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym, gfc_basic_typename (kind_expr->ts.type)); goto error_return; } + if (kind_expr->ts.type == BT_INTEGER && !ok) + { + gfc_error ("The parameter expression at %C does not " + "simplify to an INTEGER constant"); + goto error_return; + } tail->expr = gfc_copy_expr (kind_expr); }