aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2018-10-09 20:03:31 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2018-10-09 20:03:31 +0200
commitaf2d2d135a3374fb8cbd04f027683b0cbb868d88 (patch)
tree0d24ebdd84ab190810b5ef1a5f53e72b5d9a8fd9 /gcc
parent6fd8679fceaed5e2ef131eafe806a6c2cd92395c (diff)
downloadgcc-af2d2d135a3374fb8cbd04f027683b0cbb868d88.zip
gcc-af2d2d135a3374fb8cbd04f027683b0cbb868d88.tar.gz
gcc-af2d2d135a3374fb8cbd04f027683b0cbb868d88.tar.bz2
re PR fortran/83522 (ICE on allocatable string reference, string(:)(:))
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c7
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gfortran.dg/actual_array_substr_1.f908
-rw-r--r--gcc/testsuite/gfortran.dg/actual_array_substr_2.f9011
-rw-r--r--gcc/testsuite/gfortran.dg/array_substring.f9017
6 files changed, 51 insertions, 8 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d945e20..ab6b09b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 87e65df..4ec881e 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9856352..3389faa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/actual_array_substr_1.f90 b/gcc/testsuite/gfortran.dg/actual_array_substr_1.f90
index 7c10c70..d992f45 100644
--- a/gcc/testsuite/gfortran.dg/actual_array_substr_1.f90
+++ b/gcc/testsuite/gfortran.dg/actual_array_substr_1.f90
@@ -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
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(:)
diff --git a/gcc/testsuite/gfortran.dg/actual_array_substr_2.f90 b/gcc/testsuite/gfortran.dg/actual_array_substr_2.f90
index fed5134..958ab41 100644
--- a/gcc/testsuite/gfortran.dg/actual_array_substr_2.f90
+++ b/gcc/testsuite/gfortran.dg/actual_array_substr_2.f90
@@ -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
index 0000000..ea80556
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/array_substring.f90
@@ -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