re PR fortran/83522 (ICE on allocatable string reference, string(:)(:))
authorTobias Burnus <burnus@net-b.de>
Tue, 9 Oct 2018 18:03:31 +0000 (20:03 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Tue, 9 Oct 2018 18:03:31 +0000 (20:03 +0200)
2018-10-09  Tobias Burnus <burnus@net-b.de>

PR fortran/83522
* resolve.c (resolve_ref): Reject nonscalar
substring references.

        PR fortran/83522
* gfortran.dg/actual_array_substr_1.f90: Add dg-error,
change to dg-do compile.
* gfortran.dg/actual_array_substr_2.f90: Ditto.
* gfortran.dg/array_initializer_1.f90: Use array
element not size-one section.
* gfortran.dg/array_substring.f90: New.

From-SVN: r264990

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/actual_array_substr_1.f90
gcc/testsuite/gfortran.dg/actual_array_substr_2.f90
gcc/testsuite/gfortran.dg/array_substring.f90 [new file with mode: 0644]

index d945e20..ab6b09b 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-09  Tobias Burnus <burnus@net-b.de>
+
+       PR fortran/83522
+       * resolve.c (resolve_ref): Reject nonscalar
+       substring references.
+
 2018-10-09  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/87151
index 87e65df..4ec881e 100644 (file)
@@ -5129,6 +5129,13 @@ resolve_ref (gfc_expr *expr)
          break;
 
        case REF_SUBSTRING:
+         /* F2008, R610 alias F2018, R908.  */
+         if (current_part_dimension || seen_part_dimension)
+           {
+             gfc_error ("Substring reference of nonscalar not permitted at %L",
+                        &expr->where);
+             return false;
+           }
          break;
        }
 
index 9856352..3389faa 100644 (file)
@@ -1,3 +1,13 @@
+2018-10-09  Tobias Burnus <burnus@net-b.de>
+
+       PR fortran/83522
+       * gfortran.dg/actual_array_substr_1.f90: Add dg-error,
+       change to dg-do compile.
+       * gfortran.dg/actual_array_substr_2.f90: Ditto.
+       * gfortran.dg/array_initializer_1.f90: Use array
+       element not size-one section.
+       * gfortran.dg/array_substring.f90: New.
+
 2018-10-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/derived_type5.adb, gnat.dg/derived_type5_pkg.ads: New
index 7c10c70..d992f45 100644 (file)
@@ -1,15 +1,17 @@
-! { dg-do run }
+! { dg-do compile }
 ! Test fix of PR28118, in which a substring reference to an
 ! actual argument with an array reference would cause a segfault.
 !
+! Revised for PR fortran/83522
+!
 ! Contributed by Paul Thomas  <pault@gcc.gnu.org>
 !
 program gfcbug33\r
   character(12) :: a(2)
   a(1) = "abcdefghijkl"
   a(2) = "mnopqrstuvwx"
-  call foo ((a(2:1:-1)(6:)))
-  call bar ((a(:)(7:11)))
+  call foo ((a(2:1:-1)(6:))) ! { dg-error "Substring reference of nonscalar not permitted" }
+  call bar ((a(:)(7:11))) ! { dg-error "Substring reference of nonscalar not permitted" }
 contains
   subroutine foo (chr)
     character(7) :: chr(:)
index fed5134..958ab41 100644 (file)
@@ -1,10 +1,12 @@
-! { dg-do run }
+! { dg-do compile }
 ! Tests the fix for pr28174, in which the fix for pr28118 was
 ! corrupting the character lengths of arrays that shared a
 ! character length structure.  In addition, in developing the
 ! fix, it was noted that intent(out/inout) arguments were not
 ! getting written back to the calling scope.
 !
+! Revised for PR fortran/83522
+!
 ! Based on the testscase by Harald Anlauf  <anlauf@gmx.de>
 !
 program pr28174
@@ -20,7 +22,7 @@ program pr28174
   n = m - 4
 
 ! Make sure that variable substring references work.
-  call foo (a(:)(m:m+5), c(:)(n:m+2), d(:)(5:9))
+  call foo (a(:)(m:m+5), c(:)(n:m+2), d(:)(5:9)) ! { dg-error "Substring reference of nonscalar not permitted" }
   if (any (a .ne. teststring)) STOP 1
   if (any (b .ne. teststring)) STOP 2
   if (any (c .ne. (/"ab456789#hij", &
@@ -37,8 +39,7 @@ contains
 ! This next is not required by the standard but tests the
 ! functioning of the gfortran implementation.
 !   if (all (x(:)(3:7) .eq. y)) STOP 5
-    x = foostring (:)(5 : 4 + len (x))
-    y = foostring (:)(3 : 2 + len (y))
+    x = foostring (:)(5 : 4 + len (x)) ! { dg-error "Substring reference of nonscalar not permitted" }
+    y = foostring (:)(3 : 2 + len (y)) ! { dg-error "Substring reference of nonscalar not permitted" }
   end subroutine foo
 end program pr28174
-
diff --git a/gcc/testsuite/gfortran.dg/array_substring.f90 b/gcc/testsuite/gfortran.dg/array_substring.f90
new file mode 100644 (file)
index 0000000..ea80556
--- /dev/null
@@ -0,0 +1,17 @@
+! { dg-do compile }
+!
+! PR fortran/83522
+!
+! Contributed by urbanjost and Jerry DeLisle
+!
+program testit
+  character(len=:),allocatable :: strings(:)
+  integer :: i
+  strings=[character(len=2) :: 'AA','BB']
+  write(*,*)strings(:)(:)  ! { dg-error "Substring reference of nonscalar not permitted" }
+  !strings(:)(:) ! Parse error: "Invalid character in name"
+  strings(:)(:) = 'x'   ! { dg-error "Substring reference of nonscalar not permitted" }
+  do i=1, size(strings)
+    write(*,*)strings(i)(:)  ! This is valid and works
+  end do
+end program testit