@@ -14,6 +14,8 @@ module polymorphic_test
1414 procedure , pass(this) :: elemental_sub_pass
1515 generic :: assignment (= ) = > assign_p1_int
1616 procedure :: host_assoc
17+ procedure , pass(poly) :: lt
18+ generic :: operator (<) = > lt
1719 end type
1820
1921 type, extends(p1) :: p2
@@ -34,6 +36,10 @@ module polymorphic_test
3436 class(p3), pointer :: p(:)
3537 end type
3638
39+ type outer
40+ type (p1) :: inner
41+ end type
42+
3743 contains
3844
3945 elemental subroutine assign_p1_int (lhs , rhs )
@@ -67,6 +73,12 @@ elemental subroutine elemental_sub_pass(c, this)
6773 this% a = this% a * this% b + c
6874 end subroutine
6975
76+ logical elemental function lt(i, poly)
77+ integer , intent (in ) :: i
78+ class(p1), intent (in ) :: poly
79+ lt = i < poly% a
80+ End Function
81+
7082 ! Test correct access to polymorphic entity component.
7183 subroutine component_access (p )
7284 class(p1) :: p
@@ -670,3 +682,25 @@ subroutine test_elemental_sub_poly_array_assumed(p)
670682! CHECK: }
671683
672684end module
685+
686+ program test
687+ use polymorphic_test
688+ type (outer), allocatable :: o
689+ integer :: i(5 )
690+ logical :: l(5 )
691+ allocate (o)
692+
693+ l = i < o% inner
694+ end program
695+
696+ ! CHECK-LABEL: func.func @_QQmain() {
697+ ! CHECK: %[[ADDR_O:.*]] = fir.address_of(@_QFEo) : !fir.ref<!fir.box<!fir.heap<!fir.type<_QMpolymorphic_testTouter{inner:!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>}>>>>
698+ ! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[ADDR_O]] : (!fir.ref<!fir.box<!fir.heap<!fir.type<_QMpolymorphic_testTouter{inner:!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>}>>>>) -> !fir.ref<!fir.box<none>>
699+ ! CHECK: %{{.*}} = fir.call @_FortranAAllocatableAllocate(%[[BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
700+ ! CHECK: %[[O:.*]] = fir.load %[[ADDR_O]] : !fir.ref<!fir.box<!fir.heap<!fir.type<_QMpolymorphic_testTouter{inner:!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>}>>>>
701+ ! CHECK: %[[FIELD_INNER:.*]] = fir.field_index inner, !fir.type<_QMpolymorphic_testTouter{inner:!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>}>
702+ ! CHECK: %[[COORD_INNER:.*]] = fir.coordinate_of %[[O]], %[[FIELD_INNER]] : (!fir.box<!fir.heap<!fir.type<_QMpolymorphic_testTouter{inner:!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>}>>>, !fir.field) -> !fir.ref<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>
703+ ! CHECK: %{{.*}} = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered iter_args(%arg1 = %9) -> (!fir.array<5x!fir.logical<4>>) {
704+ ! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD_INNER]] : (!fir.ref<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>
705+ ! CHECK: %{{.*}} = fir.call @_QMpolymorphic_testPlt(%17, %[[EMBOXED]]) {{.*}} : (!fir.ref<i32>, !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> !fir.logical<4>
706+ ! CHECK: }
0 commit comments