module define_types implicit none type vector_wrap real, allocatable :: data(:) integer :: metadata = 5 contains #ifndef WORKING procedure :: vector_assign_vec generic :: assignment(=) => vector_assign_vec #endif end type vector_wrap type foo type(vector_wrap) :: my_vector end type foo contains subroutine vector_assign_vec(self, other) class( vector_wrap ), intent(inout) :: self type( vector_wrap ), intent(in) :: other end subroutine vector_assign_vec end module define_types program test_recursive_default use define_types implicit none type(foo) :: my_foo print *, my_foo%my_vector%metadata end program test_recursive_default