re PR fortran/71730 (ICE when character length specification uses an undefined variable)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 30 Jul 2016 16:19:14 +0000 (16:19 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 30 Jul 2016 16:19:14 +0000 (16:19 +0000)
2016-07-30  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/71730
* decl.c (char_len_param_value): Check return value of
gfc_reduce_init_expr().

2016-07-30  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/71730
* gfortran.dg/pr71730.f90: New test.
* gfortran.dg/bounds_check_strlen_2.f90: Fix invalid code.
* gfortran.dg/array_constructor_27.f03: Update dg-error message.
* gfortran.dg/array_constructor_26.f03: Ditto.

From-SVN: r238904

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/array_constructor_26.f03
gcc/testsuite/gfortran.dg/array_constructor_27.f03
gcc/testsuite/gfortran.dg/bounds_check_strlen_2.f90
gcc/testsuite/gfortran.dg/pr71730.f90 [new file with mode: 0644]

index e8f8a81aeb9b95e2c215b5501c9ee54b88b0d7f9..775276bc5c2914c7d7cf8a27388fc1c201abb649 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-30  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/71730
+       * decl.c (char_len_param_value): Check return value of
+       gfc_reduce_init_expr().
+
 2016-07-29  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
        * trans-array.c (gfc_conv_array_ref): Fix allocation of diagnostic
index cf750391ef1f6ca47ff4a1b3e300844f8071973d..7ff2f0df29767f8d0044230408480e7e5dd145c8 100644 (file)
@@ -906,6 +906,7 @@ char_len_param_value (gfc_expr **expr, bool *deferred)
     goto syntax;
   else if ((*expr)->expr_type == EXPR_VARIABLE)
     {
+      bool t;
       gfc_expr *e;
 
       e = gfc_copy_expr (*expr);
@@ -917,7 +918,15 @@ char_len_param_value (gfc_expr **expr, bool *deferred)
          && e->ref->u.ar.dimen_type[0] == DIMEN_RANGE)
        goto syntax;
 
-      gfc_reduce_init_expr (e);
+      t = gfc_reduce_init_expr (e);
+
+      if (!t && (e->ts.type == BT_UNKNOWN
+                && e->symtree->n.sym->attr.untyped == 1
+                && e->symtree->n.sym->ns->seen_implicit_none == 1))
+       {
+         gfc_free_expr (e);
+         goto syntax;
+       }
 
       if ((e->ref && e->ref->type == REF_ARRAY
           && e->ref->u.ar.type != AR_ELEMENT)
index cf5ffcd748296fae716b965940fc538ecb2a0ae5..d41cfcaa6c315657edf505255c3bf6d227874d41 100644 (file)
@@ -1,3 +1,11 @@
+2016-07-30  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/71730
+       * gfortran.dg/pr71730.f90: New test.
+       * gfortran.dg/bounds_check_strlen_2.f90: Fix invalid code.
+       * gfortran.dg/array_constructor_27.f03: Update dg-error message.
+       * gfortran.dg/array_constructor_26.f03: Ditto.
+
 2016-07-29  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * g++.dg/pr70098.C: Remove XFAIL for powerpc64_no_dm.
index 9993099af917c3f8141521681141696f1562d1e3..bb40d09d090c8335d7b0f5bc0665c7e61545f99d 100644 (file)
@@ -10,7 +10,6 @@ MODULE WinData
   INTEGER (1), PARAMETER :: MAXFLD = 25_1, MAXHED = 5_1, MAXCHR = 80_1
   integer :: i
   TYPE TWindowData
-    CHARACTER (MAX_FLD_HED, 1) :: DWFdHd(MAXFLD) = [(" ", i = 1, MAXFLD)]
-    ! { dg-error "specification expression" "" { target *-*-* } 13 }
+    CHARACTER (MAX_FLD_HED, 1) :: DWFdHd(MAXFLD) = [(" ", i = 1, MAXFLD)] ! { dg-error "Scalar INTEGER expression" }
   END TYPE TWindowData
 END MODULE WinData
index 21adac82ad459cfdec10423bc6819d362c64898d..de0217a750028327d05959402b2044181a0c02e3 100644 (file)
@@ -8,8 +8,7 @@
 implicit none
 
 type t
-  character (a) :: arr (1) = [ "a" ]
-  ! { dg-error "specification expression" "" { target *-*-* } 11 }
+  character (a) :: arr (1) = [ "a" ] ! { dg-error "Scalar INTEGER expression" }
 end type t
 
 end
index 241db66239cd990b6602dfcfe01848830f2fbb07..73c2ea8282ea76c9ca9260ec3d9a5497f0b1f096 100644 (file)
@@ -11,8 +11,8 @@ CONTAINS
 
   SUBROUTINE test (str, n)
     IMPLICIT NONE
-    CHARACTER(len=n) :: str
     INTEGER :: n
+    CHARACTER(len=n) :: str
   END SUBROUTINE test
 
   SUBROUTINE test2 (str)
diff --git a/gcc/testsuite/gfortran.dg/pr71730.f90 b/gcc/testsuite/gfortran.dg/pr71730.f90
new file mode 100644 (file)
index 0000000..f0d48c4
--- /dev/null
@@ -0,0 +1,5 @@
+! { dg-do compile }
+subroutine foo
+  implicit none
+  character(len=bar) :: a ! { dg-error "Scalar INTEGER expression" }
+end subroutine foo