! { dg-do run } ! Test the fix for PR46897. ! ! Contributed by Rouson Damian ! module m0 implicit none type component integer :: i = 0 contains procedure :: assign0 generic :: assignment(=)=>assign0 end type type parent type(component) :: foo end type type, extends(parent) :: child integer :: j end type contains subroutine assign0(lhs,rhs) class(component), intent(out) :: lhs class(component), intent(in) :: rhs lhs%i = 20 end subroutine type(child) function new_child() end function end module module m1 implicit none type component1 integer :: i = 1 contains procedure :: assign1 generic :: assignment(=)=>assign1 end type type t type(component1) :: foo end type contains subroutine assign1(lhs,rhs) class(component1), intent(out) :: lhs class(component1), intent(in) :: rhs lhs%i = 21 end subroutine end module module m2 implicit none type component2 integer :: i = 2 end type interface assignment(=) module procedure assign2 end interface type t2 type(component2) :: foo end type contains subroutine assign2(lhs,rhs) type(component2), intent(out) :: lhs type(component2), intent(in) :: rhs lhs%i = 22 end subroutine end module program main use m0 use m1 use m2 implicit none type(child) :: infant0 type(t) :: infant1, newchild1 type(t2) :: infant2, newchild2 ! Test the reported problem. infant0 = new_child() if (infant0%parent%foo%i .ne. 20) call abort ! Test the case of comment #1 of the PR. infant1 = newchild1 if (infant1%foo%i .ne. 21) call abort ! Test the case of comment #2 of the PR. infant2 = newchild2 if (infant2%foo%i .ne. 2) call abort end