https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105658
Bug ID: 105658 Summary: Passing array component to unlimited polymorphic routine passes wrong slice Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: zed.three at gmail dot com Target Milestone: --- The following program: program f implicit none type :: foo integer :: member1 integer :: member2 end type foo type(foo), dimension(3) :: thing = [foo(1, 2), foo(3, 4), foo(5, 6)] call print_poly(thing%member1) call print_int(thing%member1) contains subroutine print_poly(array) class(*), dimension(:), intent(in) :: array select type(array) type is (integer) print*, array end select end subroutine subroutine print_int(array) integer, dimension(:), intent(in) :: array print*, array end subroutine end program f prints: 1 2 3 1 3 5 when we would expect: 1 3 5 1 3 5 Adding `-fcheck=all`, we get the warning "Fortran runtime warning: An array temporary was created" _only_ for the call to `print_int`. Adding an extra set of parentheses to the `print_poly` call (`call print_poly((thing%member1))` gives the expected behaviour, I guess because it's forcing an array temporary? This behaviour is present in 4.9.4 through to the trunk currently available on Compiler Explorer ((Compiler-Explorer-Build-gcc-7da9a089608b0ca09683332ce014fb6184842724-binutils-2.38) 13.0.0 20220518 (experimental))