diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp --- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp +++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp @@ -511,8 +511,12 @@ } mlir::Type boxTy = fir::BoxType::get(elementType); mlir::Value tdesc; - if (isPolymorphic) + if (isPolymorphic) { + if (!elementType.isa()) + elementType = mlir::NoneType::get(elementType.getContext()); boxTy = fir::ClassType::get(elementType); + } + return exv.match( [&](const fir::ArrayBoxValue &box) -> mlir::Value { mlir::Value empty; diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90 --- a/flang/test/Lower/polymorphic.f90 +++ b/flang/test/Lower/polymorphic.f90 @@ -338,25 +338,20 @@ ! CHECK-LABEL: func.func @_QMpolymorphic_testPpass_trivial_to_up() { ! CHECK: %[[CHAR:.*]] = fir.address_of(@_QQcl.{{.*}}) : !fir.ref> -! CHECK: %[[EMBOX:.*]] = fir.embox %[[CHAR]] : (!fir.ref>) -> !fir.class> -! CHECK: %[[CONVERT:.*]] = fir.convert %[[EMBOX]] : (!fir.class>) -> !fir.class -! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[CONVERT]]) {{.*}} : (!fir.class) -> () +! CHECK: %[[BOX_CHAR:.*]] = fir.embox %[[CHAR]] : (!fir.ref>) -> !fir.class +! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[BOX_CHAR]]) {{.*}} : (!fir.class) -> () -! CHECK: %[[BOX_INT:.*]] = fir.embox %{{.*}} : (!fir.ref) -> !fir.class -! CHECK: %[[UP:.*]] = fir.convert %[[BOX_INT]] : (!fir.class) -> !fir.class -! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[UP]]) {{.*}} : (!fir.class) -> () +! CHECK: %[[BOX_INT:.*]] = fir.embox %{{.*}} : (!fir.ref) -> !fir.class +! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[BOX_INT]]) {{.*}} : (!fir.class) -> () -! CHECK: %[[BOX_REAL:.*]] = fir.embox %{{.*}} : (!fir.ref) -> !fir.class -! CHECK: %[[UP:.*]] = fir.convert %[[BOX_REAL]] : (!fir.class) -> !fir.class -! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[UP]]) {{.*}} : (!fir.class) -> () +! CHECK: %[[BOX_REAL:.*]] = fir.embox %{{.*}} : (!fir.ref) -> !fir.class +! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[BOX_REAL]]) {{.*}} : (!fir.class) -> () -! CHECK: %[[BOX_LOG:.*]] = fir.embox %{{.*}} : (!fir.ref>) -> !fir.class> -! CHECK: %[[UP:.*]] = fir.convert %[[BOX_LOG]] : (!fir.class>) -> !fir.class -! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[UP]]) {{.*}} : (!fir.class) -> () +! CHECK: %[[BOX_LOG:.*]] = fir.embox %{{.*}} : (!fir.ref>) -> !fir.class +! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[BOX_LOG]]) {{.*}} : (!fir.class) -> () -! CHECK: %[[BOX_COMPLEX:.*]] = fir.embox %{{.*}} : (!fir.ref>) -> !fir.class> -! CHECK: %[[UP:.*]] = fir.convert %[[BOX_COMPLEX]] : (!fir.class>) -> !fir.class -! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[UP]]) {{.*}} : (!fir.class) -> () +! CHECK: %[[BOX_COMPLEX:.*]] = fir.embox %{{.*}} : (!fir.ref>) -> !fir.class +! CHECK: fir.call @_QMpolymorphic_testPup_input(%[[BOX_COMPLEX]]) {{.*}} : (!fir.class) -> () subroutine assign_polymorphic_allocatable() type(p1), target :: t(10,20)