diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 75a74eeb1841..c8a76fc97809 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -729,7 +729,7 @@ static constexpr IntrinsicHandler handlers[]{ {"shiftr", &I::genShift}, {"show_descriptor", &I::genShowDescriptor, - {{{"d", asBox}}}, + {{{"d", asInquired}}}, /*isElemental=*/false}, {"sign", &I::genSign}, {"signal", @@ -7891,11 +7891,42 @@ mlir::Value IntrinsicLibrary::genShiftA(mlir::Type resultType, void IntrinsicLibrary::genShowDescriptor( llvm::ArrayRef args) { assert(args.size() == 1 && "expected single argument for show_descriptor"); - const mlir::Value descriptor = fir::getBase(args[0]); + const mlir::Value arg = fir::getBase(args[0]); - assert(fir::isa_box_type(descriptor.getType()) && - "argument must have been lowered to box type"); - fir::runtime::genShowDescriptor(builder, loc, descriptor); + // Use consistent !fir.ref> argument type + auto targetType = fir::BoxType::get(builder.getNoneType()); + auto targetRefType = fir::ReferenceType::get(targetType); + + mlir::Value descrAddr = nullptr; + if (fir::isBoxAddress(arg.getType())) { + // If it's already a reference to a box, convert it to correct type and + // pass it directly + descrAddr = builder.createConvert(loc, targetRefType, arg); + } else { + // At this point, arg is either SSA descriptor or a non-descriptor entity. + // If necessary, wrap non-descriptor entity in a descriptor. + mlir::Value descriptor = nullptr; + if (fir::isa_box_type(arg.getType())) { + descriptor = arg; + } else if (fir::isa_ref_type(arg.getType())) { + // Note: here use full extended value args[0] + descriptor = builder.createBox(loc, args[0]); + } else { + // arg is a value (e.g. constant), spill it to a temporary + // because createBox expects a memory reference. + mlir::Value temp = builder.createTemporary(loc, arg.getType()); + builder.createStoreWithConvert(loc, arg, temp); + + // Note: here use full extended value args[0] + descriptor = builder.createBox(loc, fir::substBase(args[0], temp)); + } + + // Spill it to the stack + descrAddr = builder.createTemporary(loc, targetType); + builder.createStoreWithConvert(loc, descriptor, descrAddr); + } + + fir::runtime::genShowDescriptor(builder, loc, descrAddr); } // SIGNAL diff --git a/flang/test/Lower/Intrinsics/show_descriptor.f90 b/flang/test/Lower/Intrinsics/show_descriptor.f90 index a0b8d3eb4348..ed330820e550 100644 --- a/flang/test/Lower/Intrinsics/show_descriptor.f90 +++ b/flang/test/Lower/Intrinsics/show_descriptor.f90 @@ -10,8 +10,7 @@ subroutine test_int integer,allocatable :: a(:) n = 5 allocate(a(n)) -! CHECK: %[[C3:.*]] = arith.constant 3 : index -! CHECK: %[[C1:.*]] = arith.constant 1 : index +! CHECK: %[[C0_I64:.*]] = arith.constant 0 : i64 ! CHECK: %[[C5:.*]] = arith.constant 5 : i32 ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[DUMMY_SCOPE_0:.*]] = fir.dummy_scope : !fir.dscope @@ -34,20 +33,15 @@ subroutine test_int ! CHECK: %[[SHAPE_1:.*]] = fir.shape %[[SELECT_0]] : (index) -> !fir.shape<1> ! CHECK: %[[EMBOX_1:.*]] = fir.embox %[[ALLOCMEM_0]](%[[SHAPE_1]]) : (!fir.heap>, !fir.shape<1>) -> !fir.box>> ! CHECK: fir.store %[[EMBOX_1]] to %[[DECLARE_0]] : !fir.ref>>> -! CHECK: %[[LOAD_1:.*]] = fir.load %[[DECLARE_0]] : !fir.ref>>> -! CHECK: fir.call @_FortranAShowDescriptor(%[[LOAD_1]]) fastmath : (!fir.box>>) -> () +! CHECK: %[[CONVERT_ARG:.*]] = fir.convert %[[DECLARE_0]] : (!fir.ref>>>) -> !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[CONVERT_ARG]]) fastmath : (!fir.ref>) -> () call show_descriptor(a(1:3)) -! CHECK: %[[LOAD_2:.*]] = fir.load %[[DECLARE_0]] : !fir.ref>>> -! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C3]] : (index) -> !fir.shape<1> -! CHECK: %[[BOX_ADDR_0:.*]] = fir.box_addr %[[LOAD_2]] : (!fir.box>>) -> !fir.heap> -! CHECK: %[[CONSTANT_4:.*]] = arith.constant 0 : index -! CHECK: %[[BOX_DIMS_0:.*]]:3 = fir.box_dims %[[LOAD_2]], %[[CONSTANT_4]] : (!fir.box>>, index) -> (index, index, index) -! CHECK: %[[SHAPE_SHIFT_0:.*]] = fir.shape_shift %[[BOX_DIMS_0]]#0, %[[BOX_DIMS_0]]#1 : (index, index) -> !fir.shapeshift<1> -! CHECK: %[[ARRAY_COOR_0:.*]] = fir.array_coor %[[BOX_ADDR_0]](%[[SHAPE_SHIFT_0]]) %[[C1]] : (!fir.heap>, !fir.shapeshift<1>, index) -> !fir.ref -! CHECK: %[[CONVERT_1:.*]] = fir.convert %[[ARRAY_COOR_0]] : (!fir.ref) -> !fir.ref> -! CHECK: %[[EMBOX_2:.*]] = fir.embox %[[CONVERT_1]](%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_2]]) fastmath : (!fir.box>) -> () +! CHECK: %[[SHAPE_2:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1> +! CHECK: %[[EMBOX_2:.*]] = fir.embox %{{.*}}(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> +! CHECK: %[[CONVERT_2:.*]] = fir.convert %[[EMBOX_2]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_2]] to %[[ALLOCA_2:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_2]]) fastmath : (!fir.ref>) -> () deallocate(a) end subroutine test_int @@ -56,23 +50,20 @@ subroutine test_char implicit none character(len=9) :: c = 'Hey buddy' call show_descriptor(c) -! CHECK: %[[C3:.*]] = arith.constant 3 : index -! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[C9:.*]] = arith.constant 9 : index ! CHECK: %[[DUMMY_SCOPE_0:.*]] = fir.dummy_scope : !fir.dscope ! CHECK: %[[ADDRESS_OF_0:.*]] = fir.address_of(@_QMtest_show_descriptorFtest_charEc) : !fir.ref> ! CHECK: %[[DECLARE_0:.*]] = fir.declare %[[ADDRESS_OF_0]] typeparams %[[C9]] {uniq_name = "_QMtest_show_descriptorFtest_charEc"} : (!fir.ref>, index) -> !fir.ref> -! CHECK: %[[EMBOX_0:.*]] = fir.embox %[[DECLARE_0]] : (!fir.ref>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_0]]) fastmath : (!fir.box>) -> () +! CHECK: %[[EMBOX_CHAR:.*]] = fir.embox %[[DECLARE_0]] : (!fir.ref>) -> !fir.box> +! CHECK: %[[CONVERT_CHAR:.*]] = fir.convert %[[EMBOX_CHAR]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_CHAR]] to %[[ALLOCA_CHAR:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_CHAR]]) fastmath : (!fir.ref>) -> () call show_descriptor(c(1:3)) -! CHECK: %[[C1_0:.*]] = arith.constant 1 : index -! CHECK: %[[SUBI_0:.*]] = arith.subi %[[C1]], %[[C1_0]] : index -! CHECK: %[[CONVERT_0:.*]] = fir.convert %[[DECLARE_0]] : (!fir.ref>) -> !fir.ref>> -! CHECK: %[[COORDINATE_OF_0:.*]] = fir.coordinate_of %[[CONVERT_0]], %[[SUBI_0]] : (!fir.ref>>, index) -> !fir.ref> -! CHECK: %[[CONVERT_1:.*]] = fir.convert %[[COORDINATE_OF_0]] : (!fir.ref>) -> !fir.ref> -! CHECK: %[[EMBOX_1:.*]] = fir.embox %[[CONVERT_1]] : (!fir.ref>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_1]]) fastmath : (!fir.box>) -> () +! CHECK: %[[EMBOX_CHAR_SLICE:.*]] = fir.embox %{{.*}} : (!fir.ref>) -> !fir.box> +! CHECK: %[[CONVERT_CHAR_SLICE:.*]] = fir.convert %[[EMBOX_CHAR_SLICE]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_CHAR_SLICE]] to %[[ALLOCA_CHAR_SLICE:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_CHAR_SLICE]]) fastmath : (!fir.ref>) -> () ! CHECK: return end subroutine test_char @@ -103,20 +94,26 @@ subroutine test_logical call show_descriptor(l2) pla2 => la2 ! CHECK: %[[DECLARE_3:.*]] = fir.declare %[[ALLOCA_0]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QMtest_show_descriptorFtest_logicalEpla2"} : (!fir.ref>>>>) -> !fir.ref>>>> -! CHECK: %[[EMBOX_1:.*]] = fir.embox %[[DECLARE_0]] : (!fir.ref>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_1]]) fastmath : (!fir.box>) -> () -! CHECK: %[[EMBOX_2:.*]] = fir.embox %[[DECLARE_1]] : (!fir.ref>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_2]]) fastmath : (!fir.box>) -> () +! CHECK: %[[EMBOX_L1:.*]] = fir.embox %[[DECLARE_0]] : (!fir.ref>) -> !fir.box> +! CHECK: %[[CONVERT_L1:.*]] = fir.convert %[[EMBOX_L1]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_L1]] to %[[ALLOCA_L1:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_L1]]) fastmath : (!fir.ref>) -> () +! CHECK: %[[EMBOX_L2:.*]] = fir.embox %[[DECLARE_1]] : (!fir.ref>) -> !fir.box> +! CHECK: %[[CONVERT_L2:.*]] = fir.convert %[[EMBOX_L2]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_L2]] to %[[ALLOCA_L2:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_L2]]) fastmath : (!fir.ref>) -> () call show_descriptor(la2) call show_descriptor(pla2) ! CHECK: %[[CONVERT_0:.*]] = fir.convert %[[DECLARE_2]] : (!fir.ref>>) -> !fir.ref>> ! CHECK: %[[EMBOX_3:.*]] = fir.embox %[[CONVERT_0]](%[[SHAPE_0]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>>> ! CHECK: fir.store %[[EMBOX_3]] to %[[DECLARE_3]] : !fir.ref>>>> -! CHECK: %[[EMBOX_4:.*]] = fir.embox %[[DECLARE_2]](%[[SHAPE_0]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_4]]) fastmath : (!fir.box>>) -> () -! CHECK: %[[LOAD_0:.*]] = fir.load %[[DECLARE_3]] : !fir.ref>>>> -! CHECK: fir.call @_FortranAShowDescriptor(%[[LOAD_0]]) fastmath : (!fir.box>>>) -> () +! CHECK: %[[EMBOX_LA2:.*]] = fir.embox %[[DECLARE_2]](%[[SHAPE_0]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> +! CHECK: %[[CONVERT_LA2:.*]] = fir.convert %[[EMBOX_LA2]] : (!fir.box>>) -> !fir.box +! CHECK: fir.store %[[CONVERT_LA2]] to %[[ALLOCA_LA2:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_LA2]]) fastmath : (!fir.ref>) -> () +! CHECK: %[[CONVERT_PLA2:.*]] = fir.convert %[[DECLARE_3]] : (!fir.ref>>>>) -> !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[CONVERT_PLA2]]) fastmath : (!fir.ref>) -> () ! CHECK: return end subroutine test_logical @@ -130,6 +127,7 @@ subroutine test_real ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[C4:.*]] = arith.constant 4 : index ! CHECK: %[[C3:.*]] = arith.constant 3 : index +! CHECK: %[[ALLOCA_BOX:.*]] = fir.alloca !fir.box ! CHECK: %[[DUMMY_SCOPE_2:.*]] = fir.dummy_scope : !fir.dscope ! CHECK: %[[ADDRESS_OF_4:.*]] = fir.address_of(@_QMtest_show_descriptorFtest_realEhalf) : !fir.ref ! CHECK: %[[DECLARE_5:.*]] = fir.declare %[[ADDRESS_OF_4]] {uniq_name = "_QMtest_show_descriptorFtest_realEhalf"} : (!fir.ref) -> !fir.ref @@ -144,17 +142,25 @@ subroutine test_real call show_descriptor(row) call show_descriptor(w) call show_descriptor(w(1:4:2)) -! CHECK: %[[EMBOX_7:.*]] = fir.embox %[[DECLARE_5]] : (!fir.ref) -> !fir.box -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_7]]) fastmath : (!fir.box) -> () -! CHECK: %[[EMBOX_8:.*]] = fir.embox %[[DECLARE_6]](%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_8]]) fastmath : (!fir.box>) -> () -! CHECK: %[[EMBOX_9:.*]] = fir.embox %[[DECLARE_7]](%[[SHAPE_3]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_9]]) fastmath : (!fir.box>) -> () +! CHECK: %[[EMBOX_HALF:.*]] = fir.embox %[[DECLARE_5]] : (!fir.ref) -> !fir.box +! CHECK: %[[CONVERT_HALF:.*]] = fir.convert %[[EMBOX_HALF]] : (!fir.box) -> !fir.box +! CHECK: fir.store %[[CONVERT_HALF]] to %[[ALLOCA_HALF:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_HALF]]) fastmath : (!fir.ref>) -> () +! CHECK: %[[EMBOX_ROW:.*]] = fir.embox %[[DECLARE_6]](%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> +! CHECK: %[[CONVERT_ROW:.*]] = fir.convert %[[EMBOX_ROW]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_ROW]] to %[[ALLOCA_ROW:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_ROW]]) fastmath : (!fir.ref>) -> () +! CHECK: %[[EMBOX_W:.*]] = fir.embox %[[DECLARE_7]](%[[SHAPE_3]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> +! CHECK: %[[CONVERT_W:.*]] = fir.convert %[[EMBOX_W]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_W]] to %[[ALLOCA_W:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_W]]) fastmath : (!fir.ref>) -> () ! CHECK: %[[SHAPE_4:.*]] = fir.shape %[[C2]] : (index) -> !fir.shape<1> ! CHECK: %[[UNDEFINED_0:.*]] = fir.undefined index ! CHECK: %[[SLICE_0:.*]] = fir.slice %[[C1]], %[[C4]], %[[C2]] : (index, index, index) -> !fir.slice<1> ! CHECK: %[[EMBOX_10:.*]] = fir.embox %[[DECLARE_7]](%[[SHAPE_3]]) {{\[}}%[[SLICE_0]]] : (!fir.ref>, !fir.shape<1>, !fir.slice<1>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_10]]) fastmath : (!fir.box>) -> () +! CHECK: %[[CONVERT_BOX:.*]] = fir.convert %[[EMBOX_10]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_BOX]] to %[[ALLOCA_BOX]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_BOX]]) fastmath : (!fir.ref>) -> () ! CHECK: return end subroutine test_real @@ -166,11 +172,7 @@ subroutine test_complex complex :: c1 = hr complex :: c2 = hi complex :: a2(2) = (/ hr, hi /) -! CHECK: %[[CST_0:.*]] = arith.constant 0.000000e+00 : f32 -! CHECK: %[[CST_1:.*]] = arith.constant 5.000000e-01 : f32 ! CHECK: %[[C2:.*]] = arith.constant 2 : index -! CHECK: %[[ALLOCA_1:.*]] = fir.alloca complex -! CHECK: %[[ALLOCA_2:.*]] = fir.alloca complex ! CHECK: %[[DUMMY_SCOPE_3:.*]] = fir.dummy_scope : !fir.dscope ! CHECK: %[[ADDRESS_OF_7:.*]] = fir.address_of(@_QMtest_show_descriptorFtest_complexEa2) : !fir.ref>> ! CHECK: %[[SHAPE_5:.*]] = fir.shape %[[C2]] : (index) -> !fir.shape<1> @@ -183,25 +185,30 @@ subroutine test_complex ! CHECK: %[[DECLARE_11:.*]] = fir.declare %[[ADDRESS_OF_10]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QMtest_show_descriptorFtest_complexEChi"} : (!fir.ref>) -> !fir.ref> ! CHECK: %[[ADDRESS_OF_11:.*]] = fir.address_of(@_QMtest_show_descriptorFtest_complexEChr) : !fir.ref> ! CHECK: %[[DECLARE_12:.*]] = fir.declare %[[ADDRESS_OF_11]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QMtest_show_descriptorFtest_complexEChr"} : (!fir.ref>) -> !fir.ref> -! CHECK: %[[UNDEFINED_1:.*]] = fir.undefined complex -! CHECK: %[[INSERT_VALUE_0:.*]] = fir.insert_value %[[UNDEFINED_1]], %[[CST_1]], [0 : index] : (complex, f32) -> complex -! CHECK: %[[INSERT_VALUE_1:.*]] = fir.insert_value %[[INSERT_VALUE_0]], %[[CST_0]], [1 : index] : (complex, f32) -> complex -! CHECK: fir.store %[[INSERT_VALUE_1]] to %[[ALLOCA_2]] : !fir.ref> call show_descriptor(hr) -! CHECK: %[[EMBOX_11:.*]] = fir.embox %[[ALLOCA_2]] : (!fir.ref>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_11]]) fastmath : (!fir.box>) -> () +! CHECK: %[[VAL_HR_0:.*]] = fir.insert_value {{.*}} +! CHECK: %[[VAL_HR:.*]] = fir.insert_value %[[VAL_HR_0]], {{.*}} +! CHECK: fir.store %[[VAL_HR]] to %[[TEMP_HR:.*]] : !fir.ref> +! CHECK: %[[EMBOX_HR:.*]] = fir.embox %[[TEMP_HR]] : (!fir.ref>) -> !fir.box> +! CHECK: %[[CONVERT_HR:.*]] = fir.convert %[[EMBOX_HR]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_HR]] to %[[ALLOCA_HR:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_HR]]) fastmath : (!fir.ref>) -> () call show_descriptor(hi) -! CHECK: %[[INSERT_VALUE_2:.*]] = fir.insert_value %[[UNDEFINED_1]], %[[CST_0]], [0 : index] : (complex, f32) -> complex -! CHECK: %[[INSERT_VALUE_3:.*]] = fir.insert_value %[[INSERT_VALUE_2]], %[[CST_1]], [1 : index] : (complex, f32) -> complex -! CHECK: fir.store %[[INSERT_VALUE_3]] to %[[ALLOCA_1]] : !fir.ref> -! CHECK: %[[EMBOX_12:.*]] = fir.embox %[[ALLOCA_1]] : (!fir.ref>) -> !fir.box> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_12]]) fastmath : (!fir.box>) -> () +! CHECK: %[[VAL_HI_0:.*]] = fir.insert_value {{.*}} +! CHECK: %[[VAL_HI:.*]] = fir.insert_value %[[VAL_HI_0]], {{.*}} +! CHECK: fir.store %[[VAL_HI]] to %[[TEMP_HI:.*]] : !fir.ref> +! CHECK: %[[EMBOX_HI:.*]] = fir.embox %[[TEMP_HI]] : (!fir.ref>) -> !fir.box> +! CHECK: %[[CONVERT_HI:.*]] = fir.convert %[[EMBOX_HI]] : (!fir.box>) -> !fir.box +! CHECK: fir.store %[[CONVERT_HI]] to %[[ALLOCA_HI:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_HI]]) fastmath : (!fir.ref>) -> () call show_descriptor(a2) -! CHECK: %[[EMBOX_13:.*]] = fir.embox %[[DECLARE_8]](%[[SHAPE_5]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_13]]) fastmath : (!fir.box>>) -> () +! CHECK: %[[EMBOX_A2:.*]] = fir.embox %[[DECLARE_8]](%[[SHAPE_5]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> +! CHECK: %[[CONVERT_A2:.*]] = fir.convert %[[EMBOX_A2]] : (!fir.box>>) -> !fir.box +! CHECK: fir.store %[[CONVERT_A2]] to %[[ALLOCA_A2:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_A2]]) fastmath : (!fir.ref>) -> () ! CHECK: return end subroutine test_complex @@ -216,6 +223,12 @@ subroutine test_derived integer :: c end type t2 type(t2) :: vt2 = t2(7,5,3) + class(t1), allocatable :: c_t1 + class(*), allocatable :: c_unlimited + allocate(t2 :: c_t1) + c_t1 = vt2 + allocate(c_unlimited, source=vt2) + ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[C2:.*]] = arith.constant 2 : index ! CHECK: %[[C1:.*]] = arith.constant 1 : index @@ -230,12 +243,51 @@ subroutine test_derived ! CHECK: %[[DECLARE_16:.*]] = fir.declare %[[ADDRESS_OF_15]] typeparams %[[C1]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QMtest_show_descriptorFtest_derivedE.n.c"} : (!fir.ref>, index) -> !fir.ref> ! CHECK: %[[ADDRESS_OF_16:.*]] = fir.address_of(@_QMtest_show_descriptorFtest_derivedE.n.t2) : !fir.ref> ! CHECK: %[[DECLARE_17:.*]] = fir.declare %[[ADDRESS_OF_16]] typeparams %[[C2]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QMtest_show_descriptorFtest_derivedE.n.t2"} : (!fir.ref>, index) -> !fir.ref> +! CHECK: %[[ALLOCA_CT1:.*]] = fir.alloca !fir.class>> {bindc_name = "c_t1", uniq_name = "_QMtest_show_descriptorFtest_derivedEc_t1"} +! CHECK: %[[ZERO_BITS_CT1:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[EMBOX_CT1:.*]] = fir.embox %[[ZERO_BITS_CT1]] : (!fir.heap>) -> !fir.class>> +! CHECK: fir.store %[[EMBOX_CT1]] to %[[ALLOCA_CT1]] : !fir.ref>>> +! CHECK: %[[DECLARE_CT1:.*]] = fir.declare %[[ALLOCA_CT1]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QMtest_show_descriptorFtest_derivedEc_t1"} : (!fir.ref>>>) -> !fir.ref>>> +! CHECK: %[[ALLOCA_CU:.*]] = fir.alloca !fir.class> {bindc_name = "c_unlimited", uniq_name = "_QMtest_show_descriptorFtest_derivedEc_unlimited"} +! CHECK: %[[ZERO_BITS_CU:.*]] = fir.zero_bits !fir.heap +! CHECK: %[[EMBOX_CU:.*]] = fir.embox %[[ZERO_BITS_CU]] : (!fir.heap) -> !fir.class> +! CHECK: fir.store %[[EMBOX_CU]] to %[[ALLOCA_CU]] : !fir.ref>> +! CHECK: %[[DECLARE_CU:.*]] = fir.declare %[[ALLOCA_CU]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QMtest_show_descriptorFtest_derivedEc_unlimited"} : (!fir.ref>>) -> !fir.ref>> ! CHECK: %[[ADDRESS_OF_17:.*]] = fir.address_of(@_QMtest_show_descriptorFtest_derivedEvt2) : !fir.ref,c:i32}>> ! CHECK: %[[DECLARE_18:.*]] = fir.declare %[[ADDRESS_OF_17]] {uniq_name = "_QMtest_show_descriptorFtest_derivedEvt2"} : (!fir.ref,c:i32}>>) -> !fir.ref,c:i32}>> +! CHECK: %[[CONVERT_CT1:.*]] = fir.convert %[[DECLARE_CT1]] : (!fir.ref>>>) -> !fir.ref> +! CHECK: fir.call @_FortranAAssignPolymorphic(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (!fir.ref>, !fir.box, !fir.ref, i32) -> () call show_descriptor(vt2) -! CHECK: %[[EMBOX_16:.*]] = fir.embox %[[DECLARE_18]] : (!fir.ref,c:i32}>>) -> !fir.box,c:i32}>> -! CHECK: fir.call @_FortranAShowDescriptor(%[[EMBOX_16]]) fastmath : (!fir.box,c:i32}>>) -> () +! CHECK: %[[EMBOX_VT2:.*]] = fir.embox %[[DECLARE_18]] : (!fir.ref,c:i32}>>) -> !fir.box,c:i32}>> +! CHECK: %[[CONVERT_CU:.*]] = fir.convert %[[DECLARE_CU]] : (!fir.ref>>) -> !fir.ref> +! CHECK: %[[CONVERT_VT2:.*]] = fir.convert %[[EMBOX_VT2]] : (!fir.box,c:i32}>>) -> !fir.box +! CHECK: fir.store %[[CONVERT_VT2]] to %[[ALLOCA_VT2:.*]] : !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[ALLOCA_VT2]]) fastmath : (!fir.ref>) -> () + + call show_descriptor(c_t1) +! CHECK: fir.call @_FortranAShowDescriptor(%[[CONVERT_CT1]]) fastmath : (!fir.ref>) -> () + + call show_descriptor(c_unlimited) +! CHECK: fir.call @_FortranAShowDescriptor(%[[CONVERT_CU]]) fastmath : (!fir.ref>) -> () ! CHECK: return end subroutine test_derived + +subroutine test_derived_member +! CHECK-LABEL: func.func @_QMtest_show_descriptorPtest_derived_member() { + implicit none + type :: t3 + integer, allocatable :: a(:) + end type t3 + type(t3) :: vt3 +! CHECK: %[[VT3:.*]] = fir.alloca !fir.type<_QMtest_show_descriptorFtest_derived_memberTt3{a:!fir.box>>}> +! CHECK: %[[VT3_DECL:.*]] = fir.declare %[[VT3]] {uniq_name = "_QMtest_show_descriptorFtest_derived_memberEvt3"} : (!fir.ref>>}>>) -> !fir.ref>>}>> + allocate(vt3%a(5)) +! CHECK: %[[A_FIELD:.*]] = fir.field_index a, !fir.type<_QMtest_show_descriptorFtest_derived_memberTt3{a:!fir.box>>}> +! CHECK: %[[A_COORD:.*]] = fir.coordinate_of %[[VT3_DECL]], a : (!fir.ref>>}>>) -> !fir.ref>>> + call show_descriptor(vt3%a) +! CHECK: %[[CONVERT_A:.*]] = fir.convert %[[A_COORD]] : (!fir.ref>>>) -> !fir.ref> +! CHECK: fir.call @_FortranAShowDescriptor(%[[CONVERT_A]]) fastmath : (!fir.ref>) -> () + deallocate(vt3%a) +end subroutine test_derived_member end module test_show_descriptor