3 ! PR 45271: [OOP] Polymorphic code breaks when changing order of USE statements
5 ! Contributed by Harald Anlauf <anlauf@gmx.de>
9 type, abstract :: vector_class
11 procedure(op_assign_v_v), deferred :: assign
14 subroutine op_assign_v_v(this,v)
16 class(vector_class), intent(inout) :: this
17 class(vector_class), intent(in) :: v
20 end module abstract_vector
22 module concrete_vector
25 type, extends(vector_class) :: trivial_vector_type
27 procedure :: assign => my_assign
30 subroutine my_assign (this,v)
31 class(trivial_vector_type), intent(inout) :: this
32 class(vector_class), intent(in) :: v
33 write (*,*) 'Oops in concrete_vector::my_assign'
36 end module concrete_vector
38 module concrete_gradient
41 type, extends(vector_class) :: trivial_gradient_type
43 procedure :: assign => my_assign
46 subroutine my_assign (this,v)
47 class(trivial_gradient_type), intent(inout) :: this
48 class(vector_class), intent(in) :: v
49 write (*,*) 'concrete_gradient::my_assign'
51 end module concrete_gradient
54 !--- exchange these two lines to make the code work:
55 use concrete_vector ! (1)
56 use concrete_gradient ! (2)
59 type(trivial_gradient_type) :: g_initial
60 class(vector_class), allocatable :: g
61 print *, "cg: before g%assign"
62 allocate(trivial_gradient_type :: g)
63 call g%assign (g_initial)
64 print *, "cg: after g%assign"