mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
c39f4ac558
commit
ae2c036774
|
|
@ -156,6 +156,13 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees,
|
|||
if (!gfc_check_dependency (expr1, expr2, true))
|
||||
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;
|
||||
inserted_block = NULL;
|
||||
changed_statement = NULL;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in New Issue