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 @@ -124,6 +124,10 @@ return mlir::LLVM::LLVMStructType::getLiteral(&getContext(), members, /*isPacked=*/false); }); + addConversion([&](mlir::NoneType none) { + return mlir::LLVM::LLVMStructType::getLiteral( + none.getContext(), llvm::None, /*isPacked=*/false); + }); } // i32 is used here because LLVM wants i32 constants when indexing into struct 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 @@ -418,3 +418,11 @@ func private @foo1(%arg0: !fir.type}>) // CHECK-LABEL: foo1 // CHECK-SAME: !llvm.struct<"derived8", (i64, struct<(ptr, i{{.*}})>)> + +// ----- + +// Test fir.box translation. +// `none` is used for polymorphic type. +func private @foo0(%arg0: !fir.box) +// CHECK-LABEL: foo0 +// CHECK-SAME: !llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>)