diff --git a/flang/lib/Optimizer/CodeGen/TypeConverter.h b/flang/lib/Optimizer/CodeGen/TypeConverter.h --- a/flang/lib/Optimizer/CodeGen/TypeConverter.h +++ b/flang/lib/Optimizer/CodeGen/TypeConverter.h @@ -82,6 +82,9 @@ addConversion([&](fir::SequenceType sequence) { return convertSequenceType(sequence); }); + addConversion([&](fir::TypeDescType tdesc) { + return convertTypeDescType(tdesc.getContext()); + }); addConversion([&](fir::VectorType vecTy) { return mlir::VectorType::get(llvm::ArrayRef(vecTy.getLen()), convertType(vecTy.getEleTy())); @@ -275,6 +278,14 @@ return mlir::LLVM::LLVMPointerType::get(baseTy); } + // fir.tdesc --> llvm<"i8*"> + // TODO: For now use a void*, however pointer identity is not sufficient for + // the f18 object v. class distinction (F2003). + mlir::Type convertTypeDescType(mlir::MLIRContext *ctx) { + return mlir::LLVM::LLVMPointerType::get( + mlir::IntegerType::get(&getContext(), 8)); + } + /// Convert llvm::Type::TypeID to mlir::Type mlir::Type fromRealTypeID(llvm::Type::TypeID typeID, fir::KindTy kind) { switch (typeID) { diff --git a/flang/test/Fir/types-to-llvm.fir b/flang/test/Fir/types-to-llvm.fir --- a/flang/test/Fir/types-to-llvm.fir +++ b/flang/test/Fir/types-to-llvm.fir @@ -293,3 +293,11 @@ func private @foo0(%arg0: !fir.field) // CHECK-LABEL: foo0 // CHECK-SAME: i32 + +// ----- + +// Test `!fir.tdesc` conversion. + +func private @foo0(%arg0: !fir.tdesc>) +// CHECK-LABEL: foo0 +// CHECK-SAME: !llvm.ptr