! { dg-do run } ! ! Check the fix for PR34640 comments 1 and 3. ! ! This involves passing and returning pointer array components that ! point to components of arrays of derived types. ! MODULE test IMPLICIT NONE TYPE :: my_type INTEGER :: value integer :: tag END TYPE CONTAINS SUBROUTINE get_values(values, switch) INTEGER, POINTER :: values(:) integer :: switch TYPE(my_type), POINTER :: d(:) allocate (d, source = [my_type(1,101), my_type(2,102)]) if (switch .eq. 1) then values => d(:)%value if (any (values .ne. [1,2])) print *, values(2) else values => d(:)%tag if (any (values .ne. [101,102])) STOP 1 end if END SUBROUTINE function return_values(switch) result (values) INTEGER, POINTER :: values(:) integer :: switch TYPE(my_type), POINTER :: d(:) allocate (d, source = [my_type(1,101), my_type(2,102)]) if (switch .eq. 1) then values => d(:)%value if (any (values .ne. [1,2])) STOP 2 else values => d(:)%tag if (any (values([2,1]) .ne. [102,101])) STOP 3 end if END function END MODULE use test integer, pointer :: x(:) type :: your_type integer, pointer :: x(:) end type type(your_type) :: y call get_values (x, 1) if (any (x .ne. [1,2])) STOP 4 call get_values (y%x, 2) if (any (y%x .ne. [101,102])) STOP 5 x => return_values (2) if (any (x .ne. [101,102])) STOP 6 y%x => return_values (1) if (any (y%x .ne. [1,2])) STOP 7 end