diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp index 89f757585264f..8c73fc24741f6 100644 --- a/flang/lib/Optimizer/Dialect/FIRType.cpp +++ b/flang/lib/Optimizer/Dialect/FIRType.cpp @@ -326,6 +326,7 @@ mlir::Type unwrapInnerType(mlir::Type ty) { return seqTy.getEleTy(); return eleTy; }) + .Case([](auto t) { return t; }) .Default([](mlir::Type) { return mlir::Type{}; }); } diff --git a/flang/test/Fir/polymorphic.fir b/flang/test/Fir/polymorphic.fir index d85fd6daa1cbd..58b19829e7ec3 100644 --- a/flang/test/Fir/polymorphic.fir +++ b/flang/test/Fir/polymorphic.fir @@ -124,3 +124,39 @@ fir.global linkonce @_QQcl.2E2F64756D6D792E66393000 constant : !fir.char<1,12> { fir.has_value %0 : !fir.char<1,12> } +fir.global linkonce_odr @_QMmod1E.dt.t.2 constant target : !fir.type<_QM__fortran_type_infoTderivedtype{binding:!fir.box,name:!fir.box>>}>>>>,name:!fir.box>>,sizeinbytes:i64,uninstantiated:!fir.box>>,kindparameter:!fir.box>>,lenparameterkind:!fir.box>>,component:!fir.box>>,genre:i8,category:i8,kind:i8,rank:i8,__padding0:!fir.array<4xi8>,offset:i64,characterlen:!fir.type<_QM__fortran_type_infoTvalue{genre:i8,__padding0:!fir.array<7xi8>,value:i64}>,derived:!fir.box>>,lenvalue:!fir.box,value:i64}>>>>,bounds:!fir.box,value:i64}>>>>,initialization:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>>>,procptr:!fir.box>>,offset:i64,initialization:!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>}>>>>,special:!fir.box,proc:!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>}>>>>,specialbitset:i32,hasparent:i8,noinitializationneeded:i8,nodestructionneeded:i8,nofinalizationneeded:i8,__padding0:!fir.array<4xi8>}> { +} + +fir.global @_QMmod1Ea target : !fir.type<_QMmod1TtK2{v:!fir.array<2xi32>}> { + %0 = fir.undefined !fir.type<_QMmod1TtK2{v:!fir.array<2xi32>}> + %1 = fir.field_index v, !fir.type<_QMmod1TtK2{v:!fir.array<2xi32>}> + %2 = fir.undefined !fir.array<2xi32> + %c17_i32 = arith.constant 17 : i32 + %3 = fir.insert_value %2, %c17_i32, [0 : index] : (!fir.array<2xi32>, i32) -> !fir.array<2xi32> + %c-17_i32 = arith.constant -17 : i32 + %4 = fir.insert_value %3, %c-17_i32, [1 : index] : (!fir.array<2xi32>, i32) -> !fir.array<2xi32> + %c2 = arith.constant 2 : index + %5 = fir.insert_value %0, %4, ["v", !fir.type<_QMmod1TtK2{v:!fir.array<2xi32>}>] : (!fir.type<_QMmod1TtK2{v:!fir.array<2xi32>}>, !fir.array<2xi32>) -> !fir.type<_QMmod1TtK2{v:!fir.array<2xi32>}> + fir.has_value %5 : !fir.type<_QMmod1TtK2{v:!fir.array<2xi32>}> +} +func.func @_QMmod1Psub1(%arg0: !fir.ref>> {fir.bindc_name = "target"}) { + return +} +func.func @_QQmain() { + %0 = fir.alloca !fir.class> + %1 = fir.address_of(@_QMmod1Ea) : !fir.ref}>> + %2 = fir.embox %1 : (!fir.ref}>>) -> !fir.class> + fir.store %2 to %0 : !fir.ref>> + fir.call @_QMmod1Psub1(%0) fastmath : (!fir.ref>>) -> () + return +} + +// CHECK-LABEL: define void @_QQmain() { +// CHECK: %[[CLASS_NONE:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } +// CHECK: %[[DESC:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] }, i64 1 +// CHECK: store { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } { ptr @_QMmod1Ea, i64 ptrtoint (ptr getelementptr (%_QMmod1TtK2, ptr null, i32 1) to i64), i32 20180515, i8 0, i8 42, i8 1, i8 1, ptr @_QMmod1E.dt.t.2, [1 x i64] undef }, ptr %[[CLASS_NONE]], align 8 +// CHECK: %[[LOAD:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] }, ptr %[[CLASS_NONE]] +// CHECK: store { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } %[[LOAD]], ptr %[[DESC]] +// CHECK: call void @_QMmod1Psub1(ptr %[[DESC]]) + +