Ping. On Mon, 25 Jul 2016 12:55:14 +0200 Andre Vehreschild <ve...@gmx.de> wrote:
> Hi all, > > the attached patch fixes the ICE when the options in the title are > used. Two issues caused this ICE: > > 1. the error-printing routines relied on the locus.nextc which was not > set by the gfc_set_backend_locus() and is now set by the patch > (locally, not in gfc_set_backend_locus()). > > 2. the locus of the function whose result triggered the warning (and > with it the ICE) was set too late. > > Both issues are addressed by the patch. Albeit I am not quite sure, > whether my solution to 1. (the first chunk in the patch) is ok this > way. > > Bootstraps and regtests ok on x86_64-linux-gnu/F23. > > Ok for trunk? And with one week delay for gcc-5- and -6-branch? > > Regards, > Andre -- Andre Vehreschild * Email: vehre ad gmx dot de
gcc/testsuite/ChangeLog: 2016-07-25 Andre Vehreschild <ve...@gcc.gnu.org> PR fortran/70524 * gfortran.dg/dependency_48.f90: New test. gcc/fortran/ChangeLog: 2016-07-25 Andre Vehreschild <ve...@gcc.gnu.org> PR fortran/70524 * trans-array.c (gfc_trans_dummy_array_bias): Ensure that the location information is correctly set. * trans-decl.c (gfc_trans_deferred_vars): Set the locus of the current construct early.
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index e95c8dd..d52cd11 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -6103,7 +6103,12 @@ gfc_trans_dummy_array_bias (gfc_symbol * sym, tree tmpdesc, return; } + loc.nextc = NULL; gfc_save_backend_locus (&loc); + /* loc.nextc is not set by save_backend_locus but the location routines + depend on it. */ + if (loc.nextc == NULL) + loc.nextc = loc.lb->line; gfc_set_backend_locus (&sym->declared_at); /* Descriptor type. */ diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 05dfcb4..2a34a4c 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -4087,6 +4087,8 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block) else if (proc_sym->as) { tree result = TREE_VALUE (current_fake_result_decl); + gfc_save_backend_locus (&loc); + gfc_set_backend_locus (&proc_sym->declared_at); gfc_trans_dummy_array_bias (proc_sym, result, block); /* An automatic character length, pointer array result. */ @@ -4096,8 +4098,6 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block) tmp = NULL; if (proc_sym->ts.deferred) { - gfc_save_backend_locus (&loc); - gfc_set_backend_locus (&proc_sym->declared_at); gfc_start_block (&init); tmp = gfc_null_and_pass_deferred_len (proc_sym, &init, &loc); gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp); diff --git a/gcc/testsuite/gfortran.dg/dependency_48.f90 b/gcc/testsuite/gfortran.dg/dependency_48.f90 new file mode 100644 index 0000000..6470019 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dependency_48.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! { dg-options "-frepack-arrays -Warray-temporaries -O" } + +! Same as dependency_35 but with repack-arrays + +module foo + implicit none +contains + pure function bar(i,j) ! { dg-warning "Creating array temporary at \\(1\\)" } + integer, intent(in) :: i,j + integer, dimension(2,2) :: bar + bar = 33 + end function bar +end module foo + +program main + use foo + implicit none + integer a(2,2), b(2,2),c(2,2), d(2,2), e(2) + + read (*,*) b, c, d + a = matmul(b,c) + d + a = b + bar(3,4) + a = bar(3,4)*5 + b + e = sum(b,1) + 3 +end program main