[gcc/devel/c++-modules] Patch and ChangeLogs for PR92976

Nathan Sidwell nathan@gcc.gnu.org
Tue Mar 10 13:04:22 GMT 2020


https://gcc.gnu.org/g:957a1b14e99596610abb0777ca86a1c80dde24e0

commit 957a1b14e99596610abb0777ca86a1c80dde24e0
Author: Paul Thomas <pault@pc30.home>
Date:   Sun Mar 1 16:15:28 2020 +0000

    Patch and ChangeLogs for PR92976

Diff:
---
 gcc/fortran/ChangeLog                        |  6 ++++++
 gcc/fortran/match.c                          | 10 +++++++--
 gcc/testsuite/ChangeLog                      |  5 +++++
 gcc/testsuite/gfortran.dg/select_type_48.f90 | 31 ++++++++++++++++++++++++++++
 4 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 39786ecf7cb..1256b95ae75 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2020-03-01  Paul Thomas  <pault@gcc.gnu.org>
+
+	PR fortran/92976
+	* match.c (select_type_set_tmp): If the selector array spec has
+	explicit bounds, make the temporary's bounds deferred.
+
 2020-03-01  Paul Thomas  <pault@gcc.gnu.org>
 
 	PR fortran/92959
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 17196eb1ae6..753a5f1f1a4 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -6327,8 +6327,14 @@ select_type_set_tmp (gfc_typespec *ts)
 		    = CLASS_DATA (selector)->attr.dimension;
 	      sym->attr.codimension
 		    = CLASS_DATA (selector)->attr.codimension;
-	      sym->as
-		    = gfc_copy_array_spec (CLASS_DATA (selector)->as);
+	      if (CLASS_DATA (selector)->as->type != AS_EXPLICIT)
+		sym->as = gfc_copy_array_spec (CLASS_DATA (selector)->as);
+	      else
+		{
+		  sym->as = gfc_get_array_spec();
+		  sym->as->rank = CLASS_DATA (selector)->as->rank;
+		  sym->as->type = AS_DEFERRED;
+		}
 	    }
 	}
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6ae4df78e27..fd3eeba9946 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-03-01  Paul Thomas  <pault@gcc.gnu.org>
+
+	PR fortran/92976
+	* gfortran.dg/select_type_48.f90 : New test.
+
 2020-03-01  Paul Thomas  <pault@gcc.gnu.org>
 
 	PR fortran/92959
diff --git a/gcc/testsuite/gfortran.dg/select_type_48.f90 b/gcc/testsuite/gfortran.dg/select_type_48.f90
new file mode 100644
index 00000000000..d9ad01ce4f6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/select_type_48.f90
@@ -0,0 +1,31 @@
+! { dg-do run }
+!
+! Test the fix for PR92976, in which the TYPE IS statement caused an ICE
+! because of the explicit bounds of 'x'.
+!
+! Contributed by Gerhard Steinmetz  <gscfq@t-online.de>
+!
+program p
+   type t
+      integer :: i
+   end type
+   class(t), allocatable :: c(:)
+   allocate (c, source = [t(1111),t(2222),t(3333)])
+   call s(c)
+   if (sum (c%i) .ne. 3333) stop 1
+contains
+   subroutine s(x)
+      class(t) :: x(2)
+      select type (x)
+! ICE as compiler attempted to assign descriptor to an array
+         type is (t)
+            x%i = 0
+! Make sure that bounds are correctly translated.
+            call counter (x)
+      end select
+   end
+   subroutine counter (arg)
+     type(t) :: arg(:)
+     if (size (arg, 1) .ne. 2) stop 2
+   end
+end


More information about the Gcc-cvs mailing list