xref: /llvm-project/flang/test/Lower/structure-constructors.f90 (revision 12ba74e181bd6641b532e271f3bfabf53066b1c0)
199d23934SValentin Clement! Test lowering of structure constructors
2f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
399d23934SValentin Clement
499d23934SValentin Clementmodule m_struct_ctor
599d23934SValentin Clement  implicit none
699d23934SValentin Clement  type t_simple
799d23934SValentin Clement    real :: x
899d23934SValentin Clement  end type
999d23934SValentin Clement  type t_char_scalar
1099d23934SValentin Clement    real :: x
1199d23934SValentin Clement    character(3) :: c
1299d23934SValentin Clement  end type
1399d23934SValentin Clement  type t_array
1499d23934SValentin Clement    real :: x
1599d23934SValentin Clement    integer :: i(5)
1699d23934SValentin Clement  end type
1799d23934SValentin Clement  type t_char_array
1899d23934SValentin Clement    real :: x
1999d23934SValentin Clement    character(3) :: c(5)
2099d23934SValentin Clement  end type
2199d23934SValentin Clement  type t_ptr
2299d23934SValentin Clement    real :: x
2399d23934SValentin Clement    integer, pointer :: p(:,:)
2499d23934SValentin Clement  end type
2599d23934SValentin Clement  type t_nested
2699d23934SValentin Clement    real :: x
2799d23934SValentin Clement    type(t_array) :: dt
2899d23934SValentin Clement  end type
2999d23934SValentin Clementcontains
3099d23934SValentin Clement  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_simple(
3199d23934SValentin Clement  ! CHECK-SAME: %[[x:.*]]: !fir.ref<f32>{{.*}})
3299d23934SValentin Clement  subroutine test_simple(x)
3399d23934SValentin Clement    real :: x
3499d23934SValentin Clement    ! CHECK: %[[tmp:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_simple{x:f32}>
3599d23934SValentin Clement    ! CHECK: %[[field:.*]] = fir.field_index x, !fir.type<_QMm_struct_ctorTt_simple{x:f32}>
3699d23934SValentin Clement    ! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[tmp]], %[[field]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_simple{x:f32}>>, !fir.field) -> !fir.ref<f32>
3799d23934SValentin Clement    ! CHECK: %[[val:.*]] = fir.load %[[x]] : !fir.ref<f32>
3899d23934SValentin Clement    ! CHECK: fir.store %[[val]] to %[[xcoor]] : !fir.ref<f32>
3999d23934SValentin Clement    call print_simple(t_simple(x=x))
4099d23934SValentin Clement  end subroutine
4199d23934SValentin Clement
4299d23934SValentin Clement  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_char_scalar(
4399d23934SValentin Clement  ! CHECK-SAME: %[[x:.*]]: !fir.ref<f32>{{.*}})
4499d23934SValentin Clement  subroutine test_char_scalar(x)
4599d23934SValentin Clement    ! CHECK: %[[tmp:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_char_scalar{x:f32,c:!fir.char<1,3>}>
4699d23934SValentin Clement    ! CHECK: %[[xfield:.*]] = fir.field_index x, !fir.type<_QMm_struct_ctorTt_char_scalar{x:f32,c:!fir.char<1,3>}>
4799d23934SValentin Clement    ! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[tmp]], %[[xfield]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_scalar{x:f32,c:!fir.char<1,3>}>>, !fir.field) -> !fir.ref<f32>
4899d23934SValentin Clement    ! CHECK: %[[val:.*]] = fir.load %[[x]] : !fir.ref<f32>
4999d23934SValentin Clement    ! CHECK: fir.store %[[val]] to %[[xcoor]] : !fir.ref<f32>
5099d23934SValentin Clement
5199d23934SValentin Clement    ! CHECK: %[[cfield:.*]] = fir.field_index c, !fir.type<_QMm_struct_ctorTt_char_scalar{x:f32,c:!fir.char<1,3>}>
5299d23934SValentin Clement    ! CHECK: %[[ccoor:.*]] = fir.coordinate_of %[[tmp]], %[[cfield]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_scalar{x:f32,c:!fir.char<1,3>}>>, !fir.field) -> !fir.ref<!fir.char<1,3>>
5399d23934SValentin Clement    ! CHECK: %[[cst:.*]] = fir.address_of(@_QQ{{.*}}) : !fir.ref<!fir.char<1,3>>
5499d23934SValentin Clement    ! CHECK-DAG: %[[ccast:.*]] = fir.convert %[[ccoor]] : (!fir.ref<!fir.char<1,3>>) -> !fir.ref<i8>
5599d23934SValentin Clement    ! CHECK-DAG: %[[cstcast:.*]] = fir.convert %[[cst]] : (!fir.ref<!fir.char<1,3>>) -> !fir.ref<i8>
564cc9437aSTom Eccles    ! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[ccast]], %[[cstcast]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
5799d23934SValentin Clement    real :: x
5899d23934SValentin Clement    call print_char_scalar(t_char_scalar(x=x, c="abc"))
5999d23934SValentin Clement  end subroutine
6099d23934SValentin Clement
6199d23934SValentin Clement  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_simple_array(
6299d23934SValentin Clement  ! CHECK-SAME: %[[x:.*]]: !fir.ref<f32>{{.*}}, %[[j:.*]]: !fir.ref<!fir.array<5xi32>>{{.*}})
6399d23934SValentin Clement  subroutine test_simple_array(x, j)
6499d23934SValentin Clement    real :: x
6599d23934SValentin Clement    integer :: j(5)
6699d23934SValentin Clement    call print_simple_array(t_array(x=x, i=2*j))
6799d23934SValentin Clement    ! CHECK: %[[tmp:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>
6899d23934SValentin Clement    ! CHECK: %[[xfield:.*]] = fir.field_index x, !fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>
6999d23934SValentin Clement    ! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[tmp]], %[[xfield]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>, !fir.field) -> !fir.ref<f32>
7099d23934SValentin Clement    ! CHECK: %[[val:.*]] = fir.load %[[x]] : !fir.ref<f32>
7199d23934SValentin Clement    ! CHECK: fir.store %[[val]] to %[[xcoor]] : !fir.ref<f32>
7299d23934SValentin Clement
7399d23934SValentin Clement    ! CHECK: %[[ifield:.*]] = fir.field_index i, !fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>
7499d23934SValentin Clement    ! CHECK: %[[icoor:.*]] = fir.coordinate_of %[[tmp]], %[[ifield]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>, !fir.field) -> !fir.ref<!fir.array<5xi32>>
7599d23934SValentin Clement    ! CHECK: %[[iload:.*]] = fir.array_load %[[icoor]](%{{.*}}) : (!fir.ref<!fir.array<5xi32>>, !fir.shape<1>) -> !fir.array<5xi32>
7699d23934SValentin Clement    ! CHECK: %[[jload:.*]] = fir.array_load %[[j]](%{{.*}}) : (!fir.ref<!fir.array<5xi32>>, !fir.shape<1>) -> !fir.array<5xi32>
7799d23934SValentin Clement    ! CHECK: %[[loop:.*]] = fir.do_loop %[[idx:.*]] = %c0{{.*}} to %{{.*}} step %c1{{.*}} iter_args(%[[res:.*]] = %[[iload]]) -> (!fir.array<5xi32>) {
7899d23934SValentin Clement    ! CHECK:   %[[jval:.*]] = fir.array_fetch %[[jload]], %[[idx]] : (!fir.array<5xi32>, index) -> i32
7999d23934SValentin Clement    ! CHECK:   %[[ival:.*]] = arith.muli %c2{{.*}}, %[[jval]] : i32
8099d23934SValentin Clement    ! CHECK:   %[[iupdate:.*]] = fir.array_update %[[res]], %[[ival]], %[[idx]] : (!fir.array<5xi32>, i32, index) -> !fir.array<5xi32>
8199d23934SValentin Clement    ! CHECK:   fir.result %[[iupdate]] : !fir.array<5xi32>
8299d23934SValentin Clement    ! CHECK: fir.array_merge_store %[[iload]], %[[loop]] to %[[icoor]] : !fir.array<5xi32>, !fir.array<5xi32>, !fir.ref<!fir.array<5xi32>>
8399d23934SValentin Clement
8499d23934SValentin Clement  end subroutine
8599d23934SValentin Clement
8699d23934SValentin Clement! CHECK-LABEL: func @_QMm_struct_ctorPtest_char_array(
8799d23934SValentin Clement! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<f32>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) {
8899d23934SValentin Clement  subroutine test_char_array(x, c1)
8999d23934SValentin Clement  ! CHECK: %[[VAL_3:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>
9099d23934SValentin Clement  ! CHECK: %[[VAL_4:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
9199d23934SValentin Clement  ! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<5x!fir.char<1,3>>>
9299d23934SValentin Clement  ! CHECK: %[[VAL_6:.*]] = arith.constant 5 : index
9399d23934SValentin Clement  ! CHECK: %[[VAL_7:.*]] = fir.field_index x, !fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>
9499d23934SValentin Clement  ! CHECK: %[[VAL_8:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_7]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>>, !fir.field) -> !fir.ref<f32>
9599d23934SValentin Clement  ! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_0]] : !fir.ref<f32>
9699d23934SValentin Clement  ! CHECK: fir.store %[[VAL_9]] to %[[VAL_8]] : !fir.ref<f32>
9799d23934SValentin Clement  ! CHECK: %[[VAL_10:.*]] = fir.field_index c, !fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>
9899d23934SValentin Clement  ! CHECK: %[[VAL_11:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_10]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>>, !fir.field) -> !fir.ref<!fir.array<5x!fir.char<1,3>>>
9999d23934SValentin Clement  ! CHECK: %[[VAL_12:.*]] = arith.constant 5 : index
10099d23934SValentin Clement  ! CHECK: %[[VAL_13:.*]] = fir.shape %[[VAL_12]] : (index) -> !fir.shape<1>
10199d23934SValentin Clement  ! CHECK: %[[VAL_14:.*]] = fir.array_load %[[VAL_11]](%[[VAL_13]]) : (!fir.ref<!fir.array<5x!fir.char<1,3>>>, !fir.shape<1>) -> !fir.array<5x!fir.char<1,3>>
10299d23934SValentin Clement  ! CHECK: %[[VAL_15:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
10399d23934SValentin Clement  ! CHECK: %[[VAL_16:.*]] = fir.array_load %[[VAL_5]](%[[VAL_15]]) : (!fir.ref<!fir.array<5x!fir.char<1,3>>>, !fir.shape<1>) -> !fir.array<5x!fir.char<1,3>>
10421ea40d4SValentin Clement  ! CHECK: %[[char_temp:.*]] = fir.alloca !fir.char<1,3> {bindc_name = ".chrtmp"}
10599d23934SValentin Clement  ! CHECK: %[[VAL_17:.*]] = arith.constant 1 : index
10699d23934SValentin Clement  ! CHECK: %[[VAL_18:.*]] = arith.constant 0 : index
10799d23934SValentin Clement  ! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_12]], %[[VAL_17]] : index
10899d23934SValentin Clement  ! CHECK: %[[VAL_20:.*]] = fir.do_loop %[[VAL_21:.*]] = %[[VAL_18]] to %[[VAL_19]] step %[[VAL_17]] unordered iter_args(%[[VAL_22:.*]] = %[[VAL_14]]) -> (!fir.array<5x!fir.char<1,3>>) {
10999d23934SValentin Clement  ! CHECK: %[[VAL_23:.*]] = fir.array_access %[[VAL_16]], %[[VAL_21]] : (!fir.array<5x!fir.char<1,3>>, index) -> !fir.ref<!fir.char<1,3>>
11099d23934SValentin Clement  ! CHECK: %[[VAL_24:.*]] = fir.array_access %[[VAL_22]], %[[VAL_21]] : (!fir.array<5x!fir.char<1,3>>, index) -> !fir.ref<!fir.char<1,3>>
11199d23934SValentin Clement  ! CHECK: %[[VAL_25:.*]] = arith.constant 3 : index
11299d23934SValentin Clement  ! CHECK: %[[VAL_26:.*]] = arith.constant 1 : i64
11399d23934SValentin Clement  ! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_25]] : (index) -> i64
11499d23934SValentin Clement  ! CHECK: %[[VAL_28:.*]] = arith.muli %[[VAL_26]], %[[VAL_27]] : i64
11599d23934SValentin Clement  ! CHECK: %[[VAL_29:.*]] = arith.constant false
11699d23934SValentin Clement  ! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_24]] : (!fir.ref<!fir.char<1,3>>) -> !fir.ref<i8>
11721ea40d4SValentin Clement  ! CHECK: %[[VAL_31:.*]] = fir.convert %[[char_temp]] : (!fir.ref<!fir.char<1,3>>) -> !fir.ref<i8>
1184cc9437aSTom Eccles  ! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_30]], %[[VAL_31]], %[[VAL_28]], %[[VAL_29]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
11999d23934SValentin Clement  ! CHECK: %[[VAL_32:.*]] = fir.array_amend %[[VAL_22]], %[[VAL_24]] : (!fir.array<5x!fir.char<1,3>>, !fir.ref<!fir.char<1,3>>) -> !fir.array<5x!fir.char<1,3>>
12099d23934SValentin Clement  ! CHECK: fir.result %[[VAL_32]] : !fir.array<5x!fir.char<1,3>>
12199d23934SValentin Clement  ! CHECK: }
12299d23934SValentin Clement  ! CHECK: fir.array_merge_store %[[VAL_14]], %[[VAL_33:.*]] to %[[VAL_11]] : !fir.array<5x!fir.char<1,3>>, !fir.array<5x!fir.char<1,3>>, !fir.ref<!fir.array<5x!fir.char<1,3>>>
1234cc9437aSTom Eccles  ! CHECK: fir.call @_QMm_struct_ctorPprint_char_array(%[[VAL_3]]) {{.*}}: (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>>) -> ()
12499d23934SValentin Clement
12599d23934SValentin Clement    real :: x
12699d23934SValentin Clement    character(3) :: c1(5)
12799d23934SValentin Clement    call print_char_array(t_char_array(x=x, c=c1))
12899d23934SValentin Clement    ! CHECK: return
12999d23934SValentin Clement    ! CHECK: }
13099d23934SValentin Clement  end subroutine
13199d23934SValentin Clement
13299d23934SValentin Clement  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_ptr(
13399d23934SValentin Clement  ! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<f32>{{.*}}, %[[VAL_1:.*]]: !fir.box<!fir.array<?x?xi32>> {{{.*}}, fir.target}) {
13499d23934SValentin Clement  ! CHECK:         %[[VAL_3:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>
13599d23934SValentin Clement  ! CHECK:         %[[VAL_4:.*]] = fir.field_index x, !fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>
13699d23934SValentin Clement  ! CHECK:         %[[VAL_5:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_4]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>, !fir.field) -> !fir.ref<f32>
13799d23934SValentin Clement  ! CHECK:         %[[VAL_6:.*]] = fir.load %[[VAL_0]] : !fir.ref<f32>
13899d23934SValentin Clement  ! CHECK:         fir.store %[[VAL_6]] to %[[VAL_5]] : !fir.ref<f32>
13999d23934SValentin Clement  ! CHECK:         %[[VAL_7:.*]] = fir.field_index p, !fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>
14099d23934SValentin Clement  ! CHECK:         %[[VAL_8:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_7]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>
14199d23934SValentin Clement  ! CHECK:         %[[VAL_9:.*]] = arith.constant 1 : i64
14299d23934SValentin Clement  ! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i64) -> index
14399d23934SValentin Clement  ! CHECK:         %[[VAL_11:.*]] = arith.constant 2 : i64
14499d23934SValentin Clement  ! CHECK:         %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (i64) -> index
14599d23934SValentin Clement  ! CHECK:         %[[VAL_13:.*]] = arith.constant 4 : i64
14699d23934SValentin Clement  ! CHECK:         %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i64) -> index
14799d23934SValentin Clement  ! CHECK:         %[[VAL_15:.*]] = arith.constant 1 : i64
14899d23934SValentin Clement  ! CHECK:         %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i64) -> index
14999d23934SValentin Clement  ! CHECK:         %[[VAL_17:.*]] = arith.constant 1 : i64
15099d23934SValentin Clement  ! CHECK:         %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (i64) -> index
15199d23934SValentin Clement  ! CHECK:         %[[VAL_19:.*]] = arith.constant 3 : i64
15299d23934SValentin Clement  ! CHECK:         %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i64) -> index
15399d23934SValentin Clement  ! CHECK:         %[[VAL_21:.*]] = fir.slice %[[VAL_10]], %[[VAL_14]], %[[VAL_12]], %[[VAL_16]], %[[VAL_20]], %[[VAL_18]] : (index, index, index, index, index, index) -> !fir.slice<2>
15413f9089aSPeixin Qiao  ! CHECK:         %[[VAL_22:.*]] = fir.rebox %[[VAL_1]] {{\[}}%[[VAL_21]]] : (!fir.box<!fir.array<?x?xi32>>, !fir.slice<2>) -> !fir.box<!fir.array<2x3xi32>>
15513f9089aSPeixin Qiao  ! CHECK:         %[[VAL_23:.*]] = fir.rebox %[[VAL_22]] : (!fir.box<!fir.array<2x3xi32>>) -> !fir.box<!fir.ptr<!fir.array<?x?xi32>>>
15699d23934SValentin Clement  ! CHECK:         fir.store %[[VAL_23]] to %[[VAL_8]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>
1574cc9437aSTom Eccles  ! CHECK:         fir.call @_QMm_struct_ctorPprint_ptr(%[[VAL_3]]) {{.*}}: (!fir.ref<!fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>) -> ()
15899d23934SValentin Clement  ! CHECK:         return
15999d23934SValentin Clement  ! CHECK:       }
16099d23934SValentin Clement
16199d23934SValentin Clement  subroutine test_ptr(x, a)
16299d23934SValentin Clement    real :: x
16399d23934SValentin Clement    integer, target :: a(:, :)
16499d23934SValentin Clement    call print_ptr(t_ptr(x=x, p=a(1:4:2, 1:3:1)))
16599d23934SValentin Clement  end subroutine
16699d23934SValentin Clement
16799d23934SValentin Clement  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_nested(
16899d23934SValentin Clement  ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<f32>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>
16999d23934SValentin Clement  subroutine test_nested(x, d)
17099d23934SValentin Clement    real :: x
17199d23934SValentin Clement    type(t_array) :: d
17299d23934SValentin Clement  ! CHECK:         %[[VAL_2:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_nested{x:f32,dt:!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>}>
17399d23934SValentin Clement  ! CHECK:         %[[VAL_3:.*]] = fir.field_index x, !fir.type<_QMm_struct_ctorTt_nested{x:f32,dt:!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>}>
17499d23934SValentin Clement  ! CHECK:         %[[VAL_4:.*]] = fir.coordinate_of %[[VAL_2]], %[[VAL_3]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_nested{x:f32,dt:!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>}>>, !fir.field) -> !fir.ref<f32>
17599d23934SValentin Clement  ! CHECK:         %[[VAL_5:.*]] = fir.load %[[VAL_0]] : !fir.ref<f32>
17699d23934SValentin Clement  ! CHECK:         fir.store %[[VAL_5]] to %[[VAL_4]] : !fir.ref<f32>
17799d23934SValentin Clement  ! CHECK:         %[[VAL_6:.*]] = fir.field_index dt, !fir.type<_QMm_struct_ctorTt_nested{x:f32,dt:!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>}>
17899d23934SValentin Clement  ! CHECK:         %[[VAL_7:.*]] = fir.coordinate_of %[[VAL_2]], %[[VAL_6]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_nested{x:f32,dt:!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>}>>, !fir.field) -> !fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>
17999d23934SValentin Clement  ! CHECK:         %[[VAL_8:.*]] = fir.field_index x, !fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>
18099d23934SValentin Clement  ! CHECK:         %[[VAL_9:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_8]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>, !fir.field) -> !fir.ref<f32>
18168cfb6a8SEric Schweitz  ! CHECK:         %[[VAL_8b:.*]] = fir.field_index x, !fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>
18268cfb6a8SEric Schweitz  ! CHECK:         %[[VAL_10:.*]] = fir.coordinate_of %[[VAL_7]], %[[VAL_8b]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>, !fir.field) -> !fir.ref<f32>
18399d23934SValentin Clement  ! CHECK:         %[[VAL_11:.*]] = fir.load %[[VAL_9]] : !fir.ref<f32>
18499d23934SValentin Clement  ! CHECK:         fir.store %[[VAL_11]] to %[[VAL_10]] : !fir.ref<f32>
18599d23934SValentin Clement  ! CHECK:         %[[VAL_12:.*]] = fir.field_index i, !fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>
18699d23934SValentin Clement  ! CHECK:         %[[VAL_13:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_12]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>, !fir.field) -> !fir.ref<!fir.array<5xi32>>
18768cfb6a8SEric Schweitz  ! CHECK:         %[[VAL_12b:.*]] = fir.field_index i, !fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>
18868cfb6a8SEric Schweitz  ! CHECK:         %[[VAL_14:.*]] = fir.coordinate_of %[[VAL_7]], %[[VAL_12b]] : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>, !fir.field) -> !fir.ref<!fir.array<5xi32>>
18999d23934SValentin Clement  ! CHECK:         %[[VAL_15:.*]] = arith.constant 0 : index
19099d23934SValentin Clement  ! CHECK:         %[[VAL_16:.*]] = arith.constant 1 : index
19199d23934SValentin Clement  ! CHECK:         %[[VAL_17:.*]] = arith.constant 4 : index
19299d23934SValentin Clement  ! CHECK:         fir.do_loop %[[VAL_18:.*]] = %[[VAL_15]] to %[[VAL_17]] step %[[VAL_16]] {
19399d23934SValentin Clement  ! CHECK:           %[[VAL_19:.*]] = fir.coordinate_of %[[VAL_14]], %[[VAL_18]] : (!fir.ref<!fir.array<5xi32>>, index) -> !fir.ref<i32>
19499d23934SValentin Clement  ! CHECK:           %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_13]], %[[VAL_18]] : (!fir.ref<!fir.array<5xi32>>, index) -> !fir.ref<i32>
19599d23934SValentin Clement  ! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<i32>
19699d23934SValentin Clement  ! CHECK:           fir.store %[[VAL_21]] to %[[VAL_19]] : !fir.ref<i32>
19799d23934SValentin Clement  ! CHECK:         }
19899d23934SValentin Clement    call print_nested(t_nested(x=x, dt=d))
19999d23934SValentin Clement  end subroutine
20099d23934SValentin Clement
20199d23934SValentin Clement  subroutine print_simple(t)
20299d23934SValentin Clement    type(t_simple) :: t
20399d23934SValentin Clement    print *, t%x
20499d23934SValentin Clement  end subroutine
20599d23934SValentin Clement  subroutine print_char_scalar(t)
20699d23934SValentin Clement    type(t_char_scalar) :: t
20799d23934SValentin Clement    print *, t%x, t%c
20899d23934SValentin Clement  end subroutine
20999d23934SValentin Clement  subroutine print_simple_array(t)
21099d23934SValentin Clement    type(t_array) :: t
21199d23934SValentin Clement    print *, t%x, t%i
21299d23934SValentin Clement  end subroutine
21399d23934SValentin Clement  subroutine print_char_array(t)
21499d23934SValentin Clement    type(t_char_array) :: t
21599d23934SValentin Clement    print *, t%x, t%c
21699d23934SValentin Clement  end subroutine
21799d23934SValentin Clement  subroutine print_ptr(t)
21899d23934SValentin Clement    type(t_ptr) :: t
21999d23934SValentin Clement    print *, t%x, t%p
22099d23934SValentin Clement  end subroutine
22199d23934SValentin Clement  subroutine print_nested(t)
22299d23934SValentin Clement    type(t_nested) :: t
22399d23934SValentin Clement    print *, t%x, t%dt%x, t%dt%i
22499d23934SValentin Clement  end subroutine
22599d23934SValentin Clement
22699d23934SValentin Clementend module
22799d23934SValentin Clement
22899d23934SValentin Clement  use m_struct_ctor
22999d23934SValentin Clement  integer, target :: i(4,3) = reshape([1,2,3,4,5,6,7,8,9,10,11,12], [4,3])
23099d23934SValentin Clement  call test_simple(42.)
23199d23934SValentin Clement  call test_char_scalar(42.)
23299d23934SValentin Clement  call test_simple_array(42., [1,2,3,4,5])
23399d23934SValentin Clement  call test_char_array(42., ["abc", "def", "geh", "ijk", "lmn"])
23499d23934SValentin Clement  call test_ptr(42., i)
23599d23934SValentin Clement  call test_nested(42., t_array(x=43., i=[5,6,7,8,9]))
23699d23934SValentin Clementend
23753121986SPeixin-Qiao
23853121986SPeixin-Qiao! CHECK-LABEL: func.func @_QPtest_parent_component1() {
23953121986SPeixin-Qiao! CHECK:         %[[VAL_0:.*]] = fir.alloca !fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>
24053121986SPeixin-Qiao! CHECK:         %[[VAL_1:.*]] = fir.alloca !fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>
24153121986SPeixin-Qiao! CHECK:         %[[VAL_14:.*]] = fir.field_index x, !fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>
24253121986SPeixin-Qiao! CHECK:         %[[VAL_15:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_14]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>, !fir.field) -> !fir.ref<i32>
24353121986SPeixin-Qiao! CHECK:         %[[VAL_16:.*]] = arith.constant 1 : i32
24453121986SPeixin-Qiao! CHECK:         fir.store %[[VAL_16]] to %[[VAL_15]] : !fir.ref<i32>
24553121986SPeixin-Qiao! CHECK:         %[[VAL_17:.*]] = fir.field_index y, !fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>
24653121986SPeixin-Qiao! CHECK:         %[[VAL_18:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_17]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>, !fir.field) -> !fir.ref<!fir.array<2xi32>>
24753121986SPeixin-Qiao! CHECK:         %[[VAL_19:.*]] = arith.constant 2 : index
24853121986SPeixin-Qiao! CHECK:         %[[VAL_20:.*]] = fir.shape %[[VAL_19]] : (index) -> !fir.shape<1>
24953121986SPeixin-Qiao! CHECK:         %[[VAL_21:.*]] = fir.array_load %[[VAL_18]](%[[VAL_20]]) : (!fir.ref<!fir.array<2xi32>>, !fir.shape<1>) -> !fir.array<2xi32>
25053121986SPeixin-Qiao! CHECK:         %[[VAL_23:.*]] = arith.constant 2 : index
25153121986SPeixin-Qiao! CHECK:         %[[VAL_24:.*]] = fir.shape %[[VAL_23]] : (index) -> !fir.shape<1>
25253121986SPeixin-Qiao! CHECK:         %[[VAL_25:.*]] = fir.array_load %[[VAL_22:.*]](%[[VAL_24]]) : (!fir.ref<!fir.array<2xi32>>, !fir.shape<1>) -> !fir.array<2xi32>
25353121986SPeixin-Qiao! CHECK:         %[[VAL_26:.*]] = arith.constant 1 : index
25453121986SPeixin-Qiao! CHECK:         %[[VAL_27:.*]] = arith.constant 0 : index
25553121986SPeixin-Qiao! CHECK:         %[[VAL_28:.*]] = arith.subi %[[VAL_19]], %[[VAL_26]] : index
25653121986SPeixin-Qiao! CHECK:         %[[VAL_29:.*]] = fir.do_loop %[[VAL_30:.*]] = %[[VAL_27]] to %[[VAL_28]] step %[[VAL_26]] unordered iter_args(%[[VAL_31:.*]] = %[[VAL_21]]) -> (!fir.array<2xi32>) {
25753121986SPeixin-Qiao! CHECK:           %[[VAL_32:.*]] = fir.array_fetch %[[VAL_25]], %[[VAL_30]] : (!fir.array<2xi32>, index) -> i32
25853121986SPeixin-Qiao! CHECK:           %[[VAL_33:.*]] = fir.array_update %[[VAL_31]], %[[VAL_32]], %[[VAL_30]] : (!fir.array<2xi32>, i32, index) -> !fir.array<2xi32>
25953121986SPeixin-Qiao! CHECK:           fir.result %[[VAL_33]] : !fir.array<2xi32>
26053121986SPeixin-Qiao! CHECK:         }
26153121986SPeixin-Qiao! CHECK:         fir.array_merge_store %[[VAL_21]], %[[VAL_34:.*]] to %[[VAL_18]] : !fir.array<2xi32>, !fir.array<2xi32>, !fir.ref<!fir.array<2xi32>>
26253121986SPeixin-Qiao! CHECK:         %[[VAL_35:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>
26353121986SPeixin-Qiao! CHECK:         %[[VAL_36:.*]] = fir.field_index x, !fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>
26453121986SPeixin-Qiao! CHECK:         %[[VAL_37:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_36]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>, !fir.field) -> !fir.ref<i32>
26553121986SPeixin-Qiao! CHECK:         %[[VAL_38:.*]] = fir.field_index x, !fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>
26653121986SPeixin-Qiao! CHECK:         %[[VAL_39:.*]] = fir.coordinate_of %[[VAL_35]], %[[VAL_38]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>, !fir.field) -> !fir.ref<i32>
26753121986SPeixin-Qiao! CHECK:         %[[VAL_40:.*]] = fir.load %[[VAL_37]] : !fir.ref<i32>
26853121986SPeixin-Qiao! CHECK:         fir.store %[[VAL_40]] to %[[VAL_39]] : !fir.ref<i32>
26953121986SPeixin-Qiao! CHECK:         %[[VAL_41:.*]] = fir.field_index y, !fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>
27053121986SPeixin-Qiao! CHECK:         %[[VAL_42:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_41]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>, !fir.field) -> !fir.ref<!fir.array<2xi32>>
27153121986SPeixin-Qiao! CHECK:         %[[VAL_43:.*]] = fir.field_index y, !fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>
27253121986SPeixin-Qiao! CHECK:         %[[VAL_44:.*]] = fir.coordinate_of %[[VAL_35]], %[[VAL_43]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>, !fir.field) -> !fir.ref<!fir.array<2xi32>>
27353121986SPeixin-Qiao! CHECK:         %[[VAL_45:.*]] = arith.constant 0 : index
27453121986SPeixin-Qiao! CHECK:         %[[VAL_46:.*]] = arith.constant 1 : index
27553121986SPeixin-Qiao! CHECK:         %[[VAL_47:.*]] = arith.constant 1 : index
27653121986SPeixin-Qiao! CHECK:         fir.do_loop %[[VAL_48:.*]] = %[[VAL_45]] to %[[VAL_47]] step %[[VAL_46]] {
27753121986SPeixin-Qiao! CHECK:           %[[VAL_49:.*]] = fir.coordinate_of %[[VAL_44]], %[[VAL_48]] : (!fir.ref<!fir.array<2xi32>>, index) -> !fir.ref<i32>
27853121986SPeixin-Qiao! CHECK:           %[[VAL_50:.*]] = fir.coordinate_of %[[VAL_42]], %[[VAL_48]] : (!fir.ref<!fir.array<2xi32>>, index) -> !fir.ref<i32>
27953121986SPeixin-Qiao! CHECK:           %[[VAL_51:.*]] = fir.load %[[VAL_50]] : !fir.ref<i32>
28053121986SPeixin-Qiao! CHECK:           fir.store %[[VAL_51]] to %[[VAL_49]] : !fir.ref<i32>
28153121986SPeixin-Qiao! CHECK:         }
28253121986SPeixin-Qiao! CHECK:         %[[VAL_52:.*]] = fir.field_index mask, !fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>
28353121986SPeixin-Qiao! CHECK:         %[[VAL_53:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_52]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>>, !fir.field) -> !fir.ref<!fir.logical<4>>
28453121986SPeixin-Qiao! CHECK:         %[[VAL_54:.*]] = arith.constant true
28553121986SPeixin-Qiao! CHECK:         %[[VAL_55:.*]] = fir.convert %[[VAL_54]] : (i1) -> !fir.logical<4>
28653121986SPeixin-Qiao! CHECK:         fir.store %[[VAL_55]] to %[[VAL_53]] : !fir.ref<!fir.logical<4>>
2874cc9437aSTom Eccles! CHECK:         fir.call @_QPprint_parent_component1(%[[VAL_1]]) {{.*}}: (!fir.ref<!fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>>) -> ()
28853121986SPeixin-Qiao! CHECK:         return
28953121986SPeixin-Qiao! CHECK:       }
29053121986SPeixin-Qiao
29153121986SPeixin-Qiaosubroutine test_parent_component1()
29253121986SPeixin-Qiao  type base
29353121986SPeixin-Qiao    integer :: x, y(2)
29453121986SPeixin-Qiao  end type base
29553121986SPeixin-Qiao  type, extends(base) :: mid
29653121986SPeixin-Qiao    logical :: mask
29753121986SPeixin-Qiao  end type mid
29853121986SPeixin-Qiao
29953121986SPeixin-Qiao  call print_parent_component1(mid(base = base(1, [2, 3]), mask = .true.))
30053121986SPeixin-Qiaoend
30153121986SPeixin-Qiao
30253121986SPeixin-Qiao! CHECK-LABEL: func.func @_QPtest_parent_component2() {
30353121986SPeixin-Qiao! CHECK:         %[[VAL_0:.*]] = fir.alloca !fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>
30453121986SPeixin-Qiao! CHECK:         %[[VAL_1:.*]] = fir.address_of(@_QFtest_parent_component2Epv) : !fir.ref<!fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>>
30553121986SPeixin-Qiao! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<!fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>>
30653121986SPeixin-Qiao! CHECK:         %[[VAL_9:.*]] = fir.field_index z, !fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>
30753121986SPeixin-Qiao! CHECK:         %[[VAL_10:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_9]] : (!fir.ref<!fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>>, !fir.field) -> !fir.ref<!fir.char<1,5>>
30853121986SPeixin-Qiao! CHECK:         %[[VAL_11:.*]] = fir.field_index z, !fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>
30953121986SPeixin-Qiao! CHECK:         %[[VAL_12:.*]] = fir.coordinate_of %[[VAL_8]], %[[VAL_11]] : (!fir.ref<!fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>>, !fir.field) -> !fir.ref<!fir.char<1,5>>
31053121986SPeixin-Qiao! CHECK:         %[[VAL_13:.*]] = arith.constant 5 : index
31153121986SPeixin-Qiao! CHECK:         %[[VAL_14:.*]] = arith.constant 1 : i64
31253121986SPeixin-Qiao! CHECK:         %[[VAL_15:.*]] = fir.convert %[[VAL_13]] : (index) -> i64
31353121986SPeixin-Qiao! CHECK:         %[[VAL_16:.*]] = arith.muli %[[VAL_14]], %[[VAL_15]] : i64
31453121986SPeixin-Qiao! CHECK:         %[[VAL_17:.*]] = arith.constant false
31553121986SPeixin-Qiao! CHECK:         %[[VAL_18:.*]] = fir.convert %[[VAL_12]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
31653121986SPeixin-Qiao! CHECK:         %[[VAL_19:.*]] = fir.convert %[[VAL_10]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
3174cc9437aSTom Eccles! CHECK:         fir.call @llvm.memmove.p0.p0.i64(%[[VAL_18]], %[[VAL_19]], %[[VAL_16]], %[[VAL_17]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
31853121986SPeixin-Qiao! CHECK:         %[[VAL_20:.*]] = fir.field_index mask, !fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>
31953121986SPeixin-Qiao! CHECK:         %[[VAL_21:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_20]] : (!fir.ref<!fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>>, !fir.field) -> !fir.ref<!fir.logical<4>>
32053121986SPeixin-Qiao! CHECK:         %[[VAL_22:.*]] = arith.constant true
32153121986SPeixin-Qiao! CHECK:         %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i1) -> !fir.logical<4>
32253121986SPeixin-Qiao! CHECK:         fir.store %[[VAL_23]] to %[[VAL_21]] : !fir.ref<!fir.logical<4>>
3234cc9437aSTom Eccles! CHECK:         fir.call @_QPprint_parent_component2(%[[VAL_0]]) {{.*}}: (!fir.ref<!fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>>) -> ()
32453121986SPeixin-Qiao! CHECK:         return
32553121986SPeixin-Qiao! CHECK:       }
32653121986SPeixin-Qiao
32753121986SPeixin-Qiaosubroutine test_parent_component2()
32853121986SPeixin-Qiao  type base
32953121986SPeixin-Qiao    character(5) :: z
33053121986SPeixin-Qiao  end type base
33153121986SPeixin-Qiao  type, extends(base) :: mid
33253121986SPeixin-Qiao    logical :: mask
33353121986SPeixin-Qiao  end type mid
33453121986SPeixin-Qiao  type(base) :: pv = base("aaa")
33553121986SPeixin-Qiao
33653121986SPeixin-Qiao  call print_parent_component2(mid(base = pv, mask = .true.))
33753121986SPeixin-Qiaoend
33853121986SPeixin-Qiao
33953121986SPeixin-Qiao! CHECK-LABEL: func.func @_QPtest_parent_component3(
34053121986SPeixin-Qiao! CHECK-SAME:                                       %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>> {fir.bindc_name = "pp"}) {
34153121986SPeixin-Qiao! CHECK:         %[[VAL_1:.*]] = fir.alloca !fir.box<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>
34253121986SPeixin-Qiao! CHECK:         %[[VAL_2:.*]] = fir.alloca !fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>
34353121986SPeixin-Qiao! CHECK:         %[[VAL_9:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>>
34453121986SPeixin-Qiao! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>
34553121986SPeixin-Qiao! CHECK:         %[[VAL_11:.*]] = fir.embox %[[VAL_10]] : (!fir.ref<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>) -> !fir.box<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>
34653121986SPeixin-Qiao! CHECK:         fir.store %[[VAL_11]] to %[[VAL_1]] : !fir.ref<!fir.box<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>
34753121986SPeixin-Qiao! CHECK:         %[[VAL_14:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.box<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>) -> !fir.ref<!fir.box<none>>
34853121986SPeixin-Qiao! CHECK:         %[[VAL_15:.*]] = fir.convert %[[VAL_9]] : (!fir.box<!fir.ptr<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>) -> !fir.box<none>
349*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK:         fir.call @_FortranAAssign(%[[VAL_14]], %[[VAL_15]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.ref<i8>, i32) -> ()
35053121986SPeixin-Qiao! CHECK:         %[[VAL_18:.*]] = fir.field_index mask, !fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>
35153121986SPeixin-Qiao! CHECK:         %[[VAL_19:.*]] = fir.coordinate_of %[[VAL_2]], %[[VAL_18]] : (!fir.ref<!fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>>, !fir.field) -> !fir.ref<!fir.logical<4>>
35253121986SPeixin-Qiao! CHECK:         %[[VAL_20:.*]] = arith.constant true
35353121986SPeixin-Qiao! CHECK:         %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i1) -> !fir.logical<4>
35453121986SPeixin-Qiao! CHECK:         fir.store %[[VAL_21]] to %[[VAL_19]] : !fir.ref<!fir.logical<4>>
3554cc9437aSTom Eccles! CHECK:         fir.call @_QPprint_parent_component3(%[[VAL_2]]) {{.*}}: (!fir.ref<!fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>>) -> ()
35653121986SPeixin-Qiao! CHECK:         return
35753121986SPeixin-Qiao! CHECK:       }
35853121986SPeixin-Qiao
35953121986SPeixin-Qiaosubroutine test_parent_component3(pp)
36053121986SPeixin-Qiao  type base
36153121986SPeixin-Qiao    character(5) :: m(2)
36253121986SPeixin-Qiao  end type base
36353121986SPeixin-Qiao  type, extends(base) :: mid
36453121986SPeixin-Qiao    logical :: mask
36553121986SPeixin-Qiao  end type mid
36653121986SPeixin-Qiao  type(base), pointer :: pp
36753121986SPeixin-Qiao
36853121986SPeixin-Qiao  call print_parent_component3(mid(base = pp, mask = .true.))
36953121986SPeixin-Qiaoend
370