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 @@ -64,6 +64,10 @@ [&](fir::PointerType pointer) { return convertPointerLike(pointer); }); addConversion( [&](fir::RecordType derived) { return convertRecordType(derived); }); + addConversion([&](fir::FieldType field) { + // Convert to i32 because of LLVM GEP indexing restriction. + return mlir::IntegerType::get(field.getContext(), 32); + }); addConversion( [&](fir::ComplexType cmplx) { return convertComplexType(cmplx); }); addConversion( 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 @@ -215,3 +215,11 @@ func private @foo1(%arg0: !fir.boxchar<2>) // CHECK-LABEL: foo1 // CHECK-SAME: !llvm.struct<(ptr, i64)> + +// ----- + +// Test `!fir.field` conversion + +func private @foo0(%arg0: !fir.field) +// CHECK-LABEL: foo0 +// CHECK-SAME: i32