2 ! PR46328 - complex expressions involving typebound operators of class objects.
6 type ,abstract :: field
8 procedure(field_op_real) ,deferred :: multiply_real
9 procedure(field_plus_field) ,deferred :: plus
10 procedure(assign_field) ,deferred :: assn
11 generic :: operator(*) => multiply_real
12 generic :: operator(+) => plus
13 generic :: ASSIGNMENT(=) => assn
16 function field_plus_field(lhs,rhs)
18 class(field) ,intent(in) :: lhs
19 class(field) ,intent(in) :: rhs
20 class(field) ,allocatable :: field_plus_field
24 function field_op_real(lhs,rhs)
26 class(field) ,intent(in) :: lhs
27 real ,intent(in) :: rhs
28 class(field) ,allocatable :: field_op_real
32 subroutine assign_field(lhs,rhs)
34 class(field) ,intent(OUT) :: lhs
35 class(field) ,intent(IN) :: rhs
43 type, extends (field) :: i_field
46 procedure :: multiply_real => i_multiply_real
47 procedure :: plus => i_plus_i
48 procedure :: assn => i_assn
51 function i_plus_i(lhs,rhs)
52 class(i_field) ,intent(in) :: lhs
53 class(field) ,intent(in) :: rhs
54 class(field) ,allocatable :: i_plus_i
57 type is (i_field); m = lhs%i
60 type is (i_field); m = rhs%i + m
62 allocate (i_plus_i, source = i_field (m))
64 function i_multiply_real(lhs,rhs)
65 class(i_field) ,intent(in) :: lhs
66 real ,intent(in) :: rhs
67 class(field) ,allocatable :: i_multiply_real
70 type is (i_field); m = lhs%i * int (rhs)
72 allocate (i_multiply_real, source = i_field (m))
74 subroutine i_assn(lhs,rhs)
75 class(i_field) ,intent(OUT) :: lhs
76 class(field) ,intent(IN) :: rhs
90 class(i_field) ,allocatable :: u
91 allocate (u, source = i_field (99))
94 u = (u*2.0*4.0) + u*4.0
95 u = u%multiply_real (2.0)*4.0
96 u = i_multiply_real (u, 2.0) * 4.0
99 type is (i_field); if (u%i .ne. 152064) STOP 1