[flang-commits] [flang] d4d4942 - [flang] Avoid verifier error when emboxing trivial type to unlimited polymorphic entity
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Thu Dec 1 05:27:50 PST 2022
Author: Valentin Clement
Date: 2022-12-01T14:27:30+01:00
New Revision: d4d4942911bfb1e26e99dbea38c8c235543b30a7
URL: https://github.com/llvm/llvm-project/commit/d4d4942911bfb1e26e99dbea38c8c235543b30a7
DIFF: https://github.com/llvm/llvm-project/commit/d4d4942911bfb1e26e99dbea38c8c235543b30a7.diff
LOG: [flang] Avoid verifier error when emboxing trivial type to unlimited polymorphic entity
Reviewed By: jeanPerier
Differential Revision: https://reviews.llvm.org/D138989
Added:
Modified:
flang/lib/Optimizer/Dialect/FIRType.cpp
flang/test/Fir/invalid-types.fir
flang/test/Lower/polymorphic.f90
Removed:
################################################################################
diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp
index 27bd29c9be99a..af4d83c84c055 100644
--- a/flang/lib/Optimizer/Dialect/FIRType.cpp
+++ b/flang/lib/Optimizer/Dialect/FIRType.cpp
@@ -508,7 +508,8 @@ fir::ClassType::verify(llvm::function_ref<mlir::InFlightDiagnostic()> emitError,
mlir::Type eleTy) {
if (eleTy.isa<fir::RecordType, fir::SequenceType, fir::HeapType,
fir::PointerType, mlir::NoneType, mlir::IntegerType,
- mlir::FloatType>())
+ mlir::FloatType, fir::CharacterType, fir::LogicalType,
+ fir::ComplexType, mlir::ComplexType>())
return mlir::success();
return emitError() << "invalid element type\n";
}
diff --git a/flang/test/Fir/invalid-types.fir b/flang/test/Fir/invalid-types.fir
index 1ab506a880634..67360df271868 100644
--- a/flang/test/Fir/invalid-types.fir
+++ b/flang/test/Fir/invalid-types.fir
@@ -166,4 +166,4 @@ func.func private @oth3() -> !fir.vector<10:>
// -----
// expected-error at +1 {{invalid element type}}
-func.func private @upe() -> !fir.class<!fir.logical<1>>
+func.func private @upe() -> !fir.class<!fir.box<i32>>
diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90
index 2860e54e9de4c..44eb03d4d5f06 100644
--- a/flang/test/Lower/polymorphic.f90
+++ b/flang/test/Lower/polymorphic.f90
@@ -267,4 +267,38 @@ subroutine nullify_pointer_array(a)
! CHECK: %[[C0:.*]] = arith.constant 0 : i32
! CHECK: %{{.*}} = fir.call @_FortranAPointerNullifyDerived(%[[CONV_P]], %[[CONV_TDESC]], %[[C1]], %[[C0]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.ref<none>, i32, i32) -> none
+ subroutine up_input(a)
+ class(*), intent(in) :: a
+ end subroutine
+
+ subroutine pass_trivial_to_up()
+ call up_input('hello')
+ call up_input(1)
+ call up_input(2.5)
+ call up_input(.true.)
+ call up_input((-1.0,3))
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPpass_trivial_to_up() {
+! CHECK: %[[CHAR:.*]] = fir.address_of(@_QQcl.{{.*}}) : !fir.ref<!fir.char<1,5>>
+! CHECK: %[[EMBOX:.*]] = fir.embox %[[CHAR]] : (!fir.ref<!fir.char<1,5>>) -> !fir.class<!fir.char<1,5>>
+! CHECK: %[[CONVERT:.*]] = fir.convert %[[EMBOX]] : (!fir.class<!fir.char<1,5>>) -> !fir.class<none>
+! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[CONVERT]]) {{.*}} : (!fir.class<none>) -> ()
+
+! CHECK: %[[BOX_INT:.*]] = fir.embox %{{.*}} : (!fir.ref<i32>) -> !fir.class<i32>
+! CHECK: %[[UP:.*]] = fir.convert %[[BOX_INT]] : (!fir.class<i32>) -> !fir.class<none>
+! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[UP]]) {{.*}} : (!fir.class<none>) -> ()
+
+! CHECK: %[[BOX_REAL:.*]] = fir.embox %{{.*}} : (!fir.ref<f32>) -> !fir.class<f32>
+! CHECK: %[[UP:.*]] = fir.convert %[[BOX_REAL]] : (!fir.class<f32>) -> !fir.class<none>
+! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[UP]]) {{.*}} : (!fir.class<none>) -> ()
+
+! CHECK: %[[BOX_LOG:.*]] = fir.embox %{{.*}} : (!fir.ref<!fir.logical<4>>) -> !fir.class<!fir.logical<4>>
+! CHECK: %[[UP:.*]] = fir.convert %[[BOX_LOG]] : (!fir.class<!fir.logical<4>>) -> !fir.class<none>
+! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[UP]]) {{.*}} : (!fir.class<none>) -> ()
+
+! CHECK: %[[BOX_COMPLEX:.*]] = fir.embox %{{.*}} : (!fir.ref<!fir.complex<4>>) -> !fir.class<!fir.complex<4>>
+! CHECK: %[[UP:.*]] = fir.convert %[[BOX_COMPLEX]] : (!fir.class<!fir.complex<4>>) -> !fir.class<none>
+! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[UP]]) {{.*}} : (!fir.class<none>) -> ()
+
end module
More information about the flang-commits
mailing list