]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran] PR 92050 - fix ICE with -fcheck=all
authorTobias Burnus <tobias@codesourcery.com>
Mon, 25 Nov 2019 14:33:32 +0000 (15:33 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Mon, 25 Nov 2019 14:33:32 +0000 (15:33 +0100)
        Backport from mainline
        2019-10-11  Tobias Burnus  <tobias@codesourcery.com>

        PR fortran/92050
        * trans-expr.c (gfc_conv_procedure_call): Handle code generated
        by -fcheck=all.

        PR fortran/92050
        * gfortran.dg/pr92050.f90: New.

From-SVN: r278689

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

index 42430e46ef6986b429cd608914552c4cbb3ef588..181a48c574e3e492aae4af200f58a5e5b153aa8d 100644 (file)
@@ -1,3 +1,12 @@
+2019-11-25  Tobias Burnus  <tobias@codesourcery.com
+
+       Backport from mainline
+       2019-10-11  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/92050
+       * trans-expr.c (gfc_conv_procedure_call): Handle code generated
+       by -fcheck=all.
+
 2019-11-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        Backport from trunk
index 52a8cdd6902e11fbdf45394ae6a130e95222d983..fe10d52dd164448f885d0c65f585fb10ce8c2fb6 100644 (file)
@@ -6818,8 +6818,11 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
        gfc_allocate_lang_decl (result);
       GFC_DECL_SAVED_DESCRIPTOR (result) = parmse.expr;
       gfc_free_expr (class_expr);
-      gcc_assert (parmse.pre.head == NULL_TREE
-                 && parmse.post.head == NULL_TREE);
+      /* -fcheck= can add diagnostic code, which has to be placed before
+        the call. */
+      if (parmse.pre.head != NULL)
+         gfc_add_expr_to_block (&se->pre, parmse.pre.head);
+      gcc_assert (parmse.post.head == NULL_TREE);
     }
 
   /* Follow the function call with the argument post block.  */
index c9e38713caaa5768cceb67672fe5e3fa783009ae..40c60b99e907b6f8d043f1411687caf632bce6f4 100644 (file)
@@ -1,3 +1,11 @@
+2019-11-25  Tobias Burnus  <tobias@codesourcery.com
+
+       Backport from mainline
+       2019-10-11  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/92050
+       * gfortran.dg/pr92050.f90: New.
+
 2019-11-25  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/addr14.adb: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr92050.f90 b/gcc/testsuite/gfortran.dg/pr92050.f90
new file mode 100644 (file)
index 0000000..6419387
--- /dev/null
@@ -0,0 +1,53 @@
+! { dg-do run }
+! { dg-options "-fcheck=all" }
+! { dg-shouldfail "above upper bound" }
+!
+! PR fortran/92050
+!
+!
+module buggy
+  implicit none (type, external)
+
+  type :: par
+  contains
+    procedure, public :: fun => fun_par
+  end type par
+
+  type comp
+    class(par), allocatable :: p
+  end type comp
+
+  type foo
+    type(comp), allocatable :: m(:)
+  end type foo
+
+contains
+
+  function fun_par(this)
+    class(par) :: this
+    integer    :: fun_par(1)
+    fun_par = 42
+  end function fun_par
+
+  subroutine update_foo(this)
+    class(foo) :: this
+    write(*,*) this%m(1)%p%fun()
+  end subroutine update_foo
+
+  subroutine bad_update_foo(this)
+    class(foo) :: this
+    write(*,*) this%m(2)%p%fun()
+  end subroutine bad_update_foo
+end module buggy
+
+program main
+  use buggy
+  implicit none (type, external)
+  type(foo) :: x
+  allocate(x%m(1))
+  allocate(x%m(1)%p)
+  call update_foo(x)
+  call bad_update_foo(x)
+end program main
+
+! { dg-output "At line 39 of file .*pr92050.f90.*Fortran runtime error: Index '2' of dimension 1 of array 'this%m' above upper bound of 1" }