re PR fortran/70673 (ICE with module containing functions with allocatable character scalars)

2016-06-27  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/70673
	* frontend-passes.c (realloc_string_callback): Add a call to
	gfc_dep_compare_expr.

2016-06-27  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/70673
	* gfortran.dg/pr70673.f90: New test.

From-SVN: r237804
This commit is contained in:
Paul Thomas 2016-06-27 20:54:56 +00:00
parent c39f4ac558
commit ae2c036774
2 changed files with 32 additions and 0 deletions

View File

@ -156,6 +156,13 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees,
if (!gfc_check_dependency (expr1, expr2, true)) if (!gfc_check_dependency (expr1, expr2, true))
return 0; return 0;
/* gfc_check_dependency doesn't always pick up identical expressions.
However, eliminating the above sends the compiler into an infinite
loop on valid expressions. Without this check, the gimplifier emits
an ICE for a = a, where a is deferred character length. */
if (!gfc_dep_compare_expr (expr1, expr2))
return 0;
current_code = c; current_code = c;
inserted_block = NULL; inserted_block = NULL;
changed_statement = NULL; changed_statement = NULL;

View File

@ -0,0 +1,25 @@
! { dg-do run }
!
! Test the fix for PR70673
!
! Contributed by David Kinniburgh <davidgkinniburgh@yahoo.co.uk>
!
module m
contains
subroutine s(inp)
character(*), intent(in) :: inp
character(:), allocatable :: a
a = a ! This used to ICE.
a = inp
a = a ! This used to ICE too
if ((len (a) .ne. 5) .or. (a .ne. "hello")) call abort
a = a(2:3) ! Make sure that temporary creation is not broken.
if ((len (a) .ne. 2) .or. (a .ne. "el")) call abort
deallocate (a)
a = a ! This would ICE too.
end subroutine s
end module m
use m
call s("hello")
end