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 9ce70f7b46130f2eda4c4bfbf254c6a3348268eb..becfda4c5fa684ec986d3c58d5d3d2f9e63ec3bc 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 d650407da4186025dd24bb99a17eefe14f6d8be4..9cc81361f43633c420f588ed337fa00dd7d51c0b 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 88ba88d8bf300e676f06ff76fc5194d841b5331b..f6e10ea379c9d7513bc2b0d6bcaf53ea48075f4d 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 4f602ed6f3188b29e041f8611fead3955026c0e4..76b14d3c11b24d0df2294e0e6336ef6bc1e45c6a 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 96172fae76a5c77e4e276e0184aa175f20c8ca19..c51390f143479141f23393816b600e256f39be0f 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 40f4a4bf89f0fc5a6645b12c8ff6bdd47315985c..e55812c76de002b3d1cd73ec0e3951d3291306d1 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 86658f2885941372da6fed9e896f6f451c4b340e..23d53508f1fce0f4ceeb5646a14db983ad09a301 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 }