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);
        }

Reply via email to