https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88486
--- Comment #5 from kargl at gcc dot gnu.org --- (In reply to G. Steinmetz from comment #0) > Affects versions down to at least gfortran-5. > Under the hood related to pr85686. > > > $ cat z1.f90 > subroutine s(x) > character(:), allocatable :: x(:) > x = ['bcd'] > x = ['a'//x//'e'] > print *, x > end > This compiles with GNU Fortran (GCC) 13.0.1 20230408 (experimental). This has an ICE with GNU Fortran (FreeBSD Ports Collection) 12.2.0. Filling out the code to something that actually does something reveals a wrong-code issue with an array constructor. There are a boat load of warnings of uninitialized variables, e.g., a.f90:53:34: 53 | x = [ ('a' // x // 'e') ] | ^ Warning: '__var_1_realloc_string.dim[0].ubound' is used uninitialized [-Wuninitialized] a.f90:1:11: 1 | program foo | ^ note: '__var_1_realloc_string' declared here a.f90:3:36: 3 | character(:), allocatable :: a(:) | ^ Warning: '.a' is used uninitialized [-Wuninitialized] a.f90:34:22: 34 | end subroutine s | ^ note: '.a' declared here program foo character(:), allocatable :: a(:) call s(a) print '(A,1X,2(I0,1X),/)', 'a: >>' // a // '<<', size(a), len(a(1)) if (allocated(a)) deallocate(a) call t(a) print '(A,1X,2(I0,1X),/)', 'a: >>' // a // '<<', size(a), len(a(1)) if (allocated(a)) deallocate(a) call u(a) print '(A,1X,2(I0,1X),/)', 'a: >>' // a // '<<', size(a), len(a(1)) if (allocated(a)) deallocate(a) call v(a) print '(A,1X,2(I0,1X),/)', 'a: >>' // a // '<<', size(a), len(a(1)) if (allocated(a)) deallocate(a) call w(a) print '(A,1X,2(I0,1X),/)', 'a: >>' // a // '<<', size(a), len(a(1)) if (allocated(a)) deallocate(a) contains subroutine s(x) character(:), allocatable :: x(:) x = ['bcd'] x = ['a' // x // 'e'] print '(A,1X,2(I0,1X))', 's: >>' // x // '<<', size(x), len(x(1)) end subroutine s subroutine t(x) character(:), allocatable :: x(:) x = ['bcd'] x = 'a' // x // 'e' print '(A,1X,2(I0,1X))', 't: >>' // x // '<<', size(x), len(x(1)) end subroutine t subroutine u(x) character(:), allocatable :: x(:) x = ['bcd'] x = [ ('a' // x // 'e') ] print '(A,1X,2(I0,1X))', 'u: >>' // x // '<<', size(x), len(x(1)) end subroutine u subroutine v(x) character(:), allocatable, intent(out) :: x(:) x = ['bcd'] x = [ ('a' // x // 'e') ] print '(A,1X,2(I0,1X))', 'v: >>' // x // '<<', size(x), len(x(1)) end subroutine v subroutine w(x) character(:), allocatable, intent(out) :: x(:) x = [ 'a' // ['bcd'] // 'e' ] print '(A,1X,2(I0,1X))', 'w: >>' // x // '<<', size(x), len(x(1)) end subroutine w end program foo s: >>abcde<< 1 5 a: >>abc<< 1 3 <--- whoops t: >>abcde<< 1 5 a: >>abcde<< 1 5 u: >>abcde<< 1 5 a: >>abc<< 1 3 <--- whoops v: >>abcde<< 1 5 a: >>abc<< 1 3 <--- whoops w: >>abcde<< 1 5 a: >>abcde<< 1 5