aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2019-10-11 13:41:13 +0000
committerTobias Burnus <burnus@gcc.gnu.org>2019-10-11 15:41:13 +0200
commit643d443665ec68270af4c950fed4cdc1adad5154 (patch)
tree55ae95c7860333fa1516368b1068408792e7af6c /gcc
parent1284e2b104a81ad93daab5110cd844981e501086 (diff)
downloadgcc-643d443665ec68270af4c950fed4cdc1adad5154.zip
gcc-643d443665ec68270af4c950fed4cdc1adad5154.tar.gz
gcc-643d443665ec68270af4c950fed4cdc1adad5154.tar.bz2
Fortran] PR 92050 - fix ICE with -fcheck=all
gcc/fortran/ PR fortran/92050 * trans-expr.c (gfc_conv_procedure_call): Handle code generated by -fcheck=all. gcc/testsuite/ PR fortran/92050 * gfortran.dg/pr92050.f90: New. From-SVN: r276885
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr92050.f9053
4 files changed, 69 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 82bc450..5aeacc1 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
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-10-11 Tobias Burnus <tobias@codesourcery.com>
+
* f95-lang.c (LANG_HOOKS_OMP_IS_ALLOCATABLE_OR_PTR): Re-define to
gfc_omp_is_allocatable_or_ptr.
* trans-decl.c (create_function_arglist): Set GFC_DECL_OPTIONAL_ARGUMENT
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 965ab77..65238ff 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -7031,8 +7031,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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c18cb5f..488eba9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-10-11 Tobias Burnus <tobias@codesourcery.com>
+
+ PR fortran/92050
+ * gfortran.dg/pr92050.f90: New.
+
2019-10-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/90883
diff --git a/gcc/testsuite/gfortran.dg/pr92050.f90 b/gcc/testsuite/gfortran.dg/pr92050.f90
new file mode 100644
index 0000000..6419387
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr92050.f90
@@ -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" }