Fortran : ICE in gfc_conv_array_constructor_expr PR93497
authorMark Eggleston <markeggleston@gcc.gnu.org>
Thu, 7 May 2020 07:29:14 +0000 (08:29 +0100)
committerMark Eggleston <markeggleston@gcc.gnu.org>
Wed, 13 May 2020 13:51:53 +0000 (14:51 +0100)
Invalid expressions, such as those involving array constructors,
used for the length of character types will cause an ICE.

2020-05-13  Steven G. Kargl  <kargl@gcc.gnu.org>

gcc/fortran/

PR fortran/93497
* decl.c (char_len_param_value): Check whether character
length expression is of type EXPR_OP and if so simplify it.
* resolve.c (resolve_charlen): Reject length if it has a
rank.

2020-05-13  Mark Eggleston  <markeggleston@gcc.gnu.org>

gcc/testsuite/

PR fortran/93497
* gfortran.dg/pr88025.f90: Change in wording of error.
* gfortran.dg/pr93497.f90: New test.
* gfortran.dg/pr93714_1.f90: Change in wording of errors.
* gfortran.dg/pr93714_2.f90: Change in wording of errors.

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr88025.f90
gcc/testsuite/gfortran.dg/pr93497.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr93714_1.f90
gcc/testsuite/gfortran.dg/pr93714_2.f90

index 9ce70f7..becfda4 100644 (file)
@@ -1,3 +1,11 @@
+2020-05-13  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/93497
+       * decl.c (char_len_param_value): Check whether character
+       length expression is of type EXPR_OP and if so simplify it.
+       * resolve.c (resolve_charlen): Reject length if it has a
+       rank.
+
 2020-05-13  Tobias Burnus  <tobias@codesourcery.com>
 
        PR fortran/94690
index d650407..9cc8136 100644 (file)
@@ -1077,6 +1077,11 @@ char_len_param_value (gfc_expr **expr, bool *deferred)
   if (!gfc_expr_check_typed (*expr, gfc_current_ns, false))
     return MATCH_ERROR;
 
+  /* If gfortran gets an EXPR_OP, try to simplifiy it.  This catches things
+     like CHARACTER(([1])).   */
+  if ((*expr)->expr_type == EXPR_OP)
+    gfc_simplify_expr (*expr, 1);
+
   if ((*expr)->expr_type == EXPR_FUNCTION)
     {
       if ((*expr)->ts.type == BT_INTEGER
index 88ba88d..f6e10ea 100644 (file)
@@ -12358,7 +12358,7 @@ resolve_charlen (gfc_charlen *cl)
        }
 
       /* cl->length has been resolved.  It should have an integer type.  */
-      if (cl->length->ts.type != BT_INTEGER)
+      if (cl->length->ts.type != BT_INTEGER || cl->length->rank != 0)
        {
          gfc_error ("Scalar INTEGER expression expected at %L",
                     &cl->length->where);
index 4f602ed..76b14d3 100644 (file)
@@ -1,3 +1,11 @@
+2020-05-13  Mark Eggleston  <markeggleston@gcc.gnu.org>
+
+       PR fortran/93497
+       * gfortran.dg/pr88025.f90: Change in wording of error.
+       * gfortran.dg/pr93497.f90: New test.
+       * gfortran.dg/pr93714_1.f90: Change in wording of errors.
+       * gfortran.dg/pr93714_2.f90: Change in wording of errors.
+
 2020-05-13  Patrick Palka  <ppalka@redhat.com>
 
        PR c++/70642
index 96172fa..c51390f 100644 (file)
@@ -2,6 +2,6 @@
 ! PR fortran/88025
 program p
    type t
-      character(('')) :: c = 'c'    ! { dg-error "must be of INTEGER type" }
+      character(('')) :: c = 'c'  ! { dg-error "Scalar INTEGER expression expected" }
    end type
 end
diff --git a/gcc/testsuite/gfortran.dg/pr93497.f90 b/gcc/testsuite/gfortran.dg/pr93497.f90
new file mode 100644 (file)
index 0000000..612b41c
--- /dev/null
@@ -0,0 +1,8 @@
+! { dg-do compile } 
+
+program p
+   print *, [character(((/1/))) :: 'a','b'] ! { dg-error "Scalar INTEGER expression expected" }
+   print *, [character(([1])) :: 'a','b']   ! { dg-error "Scalar INTEGER expression expected" }
+   print *, [character(1+[1]) :: 'a','b']   ! { dg-error "Scalar INTEGER expression expected" }
+end
+
index 40f4a4b..e55812c 100644 (file)
@@ -7,5 +7,5 @@ program test
    character, pointer :: b => a
 end program
 
-! { dg-error "must be of INTEGER type" " " { target *-*-* } 6 }
-! { dg-error "does not have the TARGET attribute" " " { target *-*-* } 7 }
+! { dg-error "Scalar INTEGER expression expected" " " { target *-*-* } 6 }
+! { dg-error "Different types in pointer assignment" " " { target *-*-* } 7 }
index 86658f2..23d5350 100644 (file)
@@ -7,5 +7,5 @@ program test
    character(:), pointer :: b => a
 end program
 
-! { dg-error "must be of INTEGER type" " " { target *-*-* } 6 }
-! { dg-error "does not have the TARGET attribute" " " { target *-*-* } 7 }
+! { dg-error "Scalar INTEGER expression expected" " " { target *-*-* } 6 }
+! { dg-error "Different types in pointer assignment" " " { target *-*-* } 7 }