]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport PRs 56386, 58906, 77385, 80260, 82077
authorPaul Thomas <pault@gcc.gnu.org>
Sun, 27 Jan 2019 18:53:47 +0000 (18:53 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sun, 27 Jan 2019 18:53:47 +0000 (18:53 +0000)
2019-01-27  Paul Thomas  <pault@gcc.gnu.org>

Backport from trunk
PR fortran/56386
PR fortran/58906
PR fortran/77385
PR fortran/80260
PR fortran/82077
* resolve.c (resolve_variable): Fix up expressions with array
associate names, where the parser did not detect that this is
array and there was no array part_ref in the expression.
* trans-expr.c (gfc_find_and_cut_at_last_class_ref): base_expr
should be a copy of e and not the initialization expr.

2019-01-27  Paul Thomas  <pault@gcc.gnu.org>

Backport from trunk
PR fortran/56386
PR fortran/58906
PR fortran/77385
* gfortran.dg/associate_44.f90 : New test.

PR fortran/80260
* gfortran.dg/select_type_45.f90 : New test.

PR fortran/82077
* gfortran.dg/select_type_46.f90 : New test.

From-SVN: r268317

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/associate_44.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/select_type_45.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/select_type_46.f90 [new file with mode: 0644]

index 31610781d431f5f951e26638b0072539e77f7974..b012295a1be363bde4f3aeedac34644e01fa1b8d 100644 (file)
@@ -1,3 +1,17 @@
+2019-01-27  Paul Thomas  <pault@gcc.gnu.org>
+
+       Backport from trunk
+       PR fortran/56386
+       PR fortran/58906
+       PR fortran/77385
+       PR fortran/80260
+       PR fortran/82077
+       * resolve.c (resolve_variable): Fix up expressions with array
+       associate names, where the parser did not detect that this is
+       array and there was no array part_ref in the expression.
+       * trans-expr.c (gfc_find_and_cut_at_last_class_ref): base_expr
+       should be a copy of e and not the initialization expr.
+
 2019-01-15  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/81849
index 31808703d4d8bbe7cde3b999005ffcf68aa2de6f..60f3ea9d592aeb25b1d583e0c7d7dce8e2da5fdc 100644 (file)
@@ -5161,6 +5161,23 @@ resolve_variable (gfc_expr *e)
        gfc_fix_class_refs (e);
       if (!sym->attr.dimension && e->ref && e->ref->type == REF_ARRAY)
        return false;
+       else if (sym->attr.dimension && (!e->ref || e->ref->type != REF_ARRAY))
+         {
+           /* This can happen because the parser did not detect that the
+              associate name is an array and the expression had no array
+              part_ref.  */
+           gfc_ref *ref = gfc_get_ref ();
+           ref->type = REF_ARRAY;
+           ref->u.ar = *gfc_get_array_ref();
+           ref->u.ar.type = AR_FULL;
+           if (sym->as)
+             {
+               ref->u.ar.as = sym->as;
+               ref->u.ar.dimen = sym->as->rank;
+             }
+           ref->next = e->ref;
+           e->ref = ref;
+         }
     }
 
   if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.generic)
index 55cd3bb6c3f59e3dd51ec1db022a216293ccf161..674eba9d9a6d5688cf84e9a06716924ed9b4156f 100644 (file)
@@ -391,7 +391,7 @@ gfc_find_and_cut_at_last_class_ref (gfc_expr *e)
       e->ref = NULL;
     }
 
-  base_expr = gfc_expr_to_initialize (e);
+  base_expr = gfc_copy_expr (e);
 
   /* Restore the original tail expression.  */
   if (class_ref)
index 9102652934368b5cd9f77efdcdbe0ee137f6c763..10f4c267c9fa48d8f902c03e6621582648489a59 100644 (file)
@@ -1,3 +1,17 @@
+2019-01-27  Paul Thomas  <pault@gcc.gnu.org>
+
+       Backport from trunk
+       PR fortran/56386
+       PR fortran/58906
+       PR fortran/77385
+       * gfortran.dg/associate_44.f90 : New test.
+
+       PR fortran/80260
+       * gfortran.dg/select_type_45.f90 : New test.
+
+       PR fortran/82077
+       * gfortran.dg/select_type_46.f90 : New test.
+
 2019-01-27  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/opt75.adb: New test.
diff --git a/gcc/testsuite/gfortran.dg/associate_44.f90 b/gcc/testsuite/gfortran.dg/associate_44.f90
new file mode 100644 (file)
index 0000000..de42d8a
--- /dev/null
@@ -0,0 +1,23 @@
+! { dg-do compile }
+!
+! Test the fix for PR56386
+!
+! Contributed by Vladimir Fuka  <vladimir.fuka@gmail.com>
+!
+subroutine  CustomSolidBodies
+   implicit none
+
+    type inner
+      real :: elev
+    end type
+
+    type :: outer
+      type(inner),dimension(0) :: PrPoints
+    end type
+
+    type(outer) :: SB
+
+    associate (Prter=>SB%PrPoints)
+       PrTer%elev=0                  ! ICE here
+    end associate
+end subroutine  CustomSolidBodies
diff --git a/gcc/testsuite/gfortran.dg/select_type_45.f90 b/gcc/testsuite/gfortran.dg/select_type_45.f90
new file mode 100644 (file)
index 0000000..a5e04fa
--- /dev/null
@@ -0,0 +1,22 @@
+! { dg-do compile }
+!
+! Tests the fix for PR80260
+!
+! Contributed by Damian Rouson  <damian@sourceryinstitute.org>
+!
+    type foo
+    end type foo
+    type, extends(foo) :: bar
+    end type
+contains
+    subroutine f(x)
+      class(foo) x(:,:)
+      select type(x)
+        class is (bar)
+          call g(x(1,:))   ! ICEd here.
+      end select
+    end subroutine
+    subroutine g(y)
+      class(bar) y(:)
+    end subroutine
+end
diff --git a/gcc/testsuite/gfortran.dg/select_type_46.f90 b/gcc/testsuite/gfortran.dg/select_type_46.f90
new file mode 100644 (file)
index 0000000..7582ab7
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-do compile }
+!
+! Tests the fix for PR82077
+!
+! Contributed by Damian Rouson  <damian@sourceryinstitute.org>
+!
+    type parent
+    end type parent
+    type, extends(parent) :: child
+    end type
+    class(parent), allocatable :: foo(:,:)
+    allocate(child::foo(1,1))
+    select type(foo)
+      class is (child)
+        call gfortran7_ICE(foo(1,:))  ! ICEd here.
+    end select
+contains
+    subroutine gfortran7_ICE(bar)
+      class(child) bar(:)
+    end subroutine
+end