diff --git a/gcc/testsuite/gfortran.dg/elemental_assignment_1.f90 b/gcc/testsuite/gfortran.dg/elemental_assignment_1.f90 new file mode 100644 index 0000000000000000000000000000000000000000..23d764313b26022a4ca657de25ea193c01016253 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/elemental_assignment_1.f90 @@ -0,0 +1,59 @@ +! { dg-do run } +! PR 67539 - this used to give a segfault at runtime. +! Test case by "mrestelli". + +module m + implicit none + + type :: t_a + real, allocatable :: x + end type t_a + + interface assignment(=) + module procedure copy_t_a + end interface + +contains + + elemental subroutine copy_t_a(y,x) + type(t_a), intent(in) :: x + type(t_a), intent(out) :: y + allocate( y%x , source=x%x ) + end subroutine copy_t_a + + elemental function new_t_a(x) result(res) + real, intent(in) :: x + type(t_a) :: res + allocate( res%x ) + res%x = x + end function new_t_a + +end module m + + +program p + use m + implicit none + + integer :: i + type(t_a) :: tmp + type(t_a), allocatable :: v(:) + + allocate( v(2) ) + + v = new_t_a(1.5) ! -> segmentation fault + + !tmp = new_t_a(1.5) ! -> OK + !v = tmp + + !do i=1,size(v) ! -> also OK + ! v(i) = new_t_a(1.5) + !enddo + + do i=1,size(v) + write(*,*) " i = ",i + write(*,*) allocated(v(i)%x) + write(*,*) v(i)%x + enddo + +end program p