[flang-commits] [flang] 658595d - [flang] Handle polymorphic entities with rank > 0 in entry statement
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Tue Mar 21 01:51:04 PDT 2023
Author: Valentin Clement
Date: 2023-03-21T09:50:57+01:00
New Revision: 658595d031f726047f6c1a19efefc5e3d265416a
URL: https://github.com/llvm/llvm-project/commit/658595d031f726047f6c1a19efefc5e3d265416a
DIFF: https://github.com/llvm/llvm-project/commit/658595d031f726047f6c1a19efefc5e3d265416a.diff
LOG: [flang] Handle polymorphic entities with rank > 0 in entry statement
Correctly create the temporary for argument absent in the entry statement.
Reviewed By: PeteSteinfeld
Differential Revision: https://reviews.llvm.org/D146447
Added:
Modified:
flang/include/flang/Optimizer/Builder/MutableBox.h
flang/lib/Lower/ConvertVariable.cpp
flang/lib/Optimizer/Builder/MutableBox.cpp
flang/test/Lower/polymorphic.f90
Removed:
################################################################################
diff --git a/flang/include/flang/Optimizer/Builder/MutableBox.h b/flang/include/flang/Optimizer/Builder/MutableBox.h
index 3f3354d93530e..f763d29c40a11 100644
--- a/flang/include/flang/Optimizer/Builder/MutableBox.h
+++ b/flang/include/flang/Optimizer/Builder/MutableBox.h
@@ -52,7 +52,8 @@ mlir::Value createUnallocatedBox(fir::FirOpBuilder &builder, mlir::Location loc,
fir::MutableBoxValue createTempMutableBox(fir::FirOpBuilder &builder,
mlir::Location loc, mlir::Type type,
llvm::StringRef name = {},
- mlir::Value sourceBox = {});
+ mlir::Value sourceBox = {},
+ bool isPolymorphic = false);
/// Update a MutableBoxValue to describe entity \p source (that must be in
/// memory). If \lbounds is not empty, it is used to defined the MutableBoxValue
diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index 1d91c86c3d2f5..4d0375bfad4eb 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -1690,12 +1690,18 @@ void Fortran::lower::mapSymbolAttributes(
"handled above");
// The box is read right away because lowering code does not expect
// a non pointer/allocatable symbol to be mapped to a MutableBox.
+ mlir::Type ty = converter.genType(var);
+ bool isPolymorphic = false;
+ if (auto boxTy = ty.dyn_cast<fir::BaseBoxType>()) {
+ isPolymorphic = ty.isa<fir::ClassType>();
+ ty = boxTy.getEleTy();
+ }
Fortran::lower::genDeclareSymbol(
converter, symMap, sym,
fir::factory::genMutableBoxRead(
builder, loc,
- fir::factory::createTempMutableBox(builder, loc,
- converter.genType(var))));
+ fir::factory::createTempMutableBox(builder, loc, ty, {}, {},
+ isPolymorphic)));
return true;
}
return false;
diff --git a/flang/lib/Optimizer/Builder/MutableBox.cpp b/flang/lib/Optimizer/Builder/MutableBox.cpp
index 8cd7aeb43f214..d092f3a2876b8 100644
--- a/flang/lib/Optimizer/Builder/MutableBox.cpp
+++ b/flang/lib/Optimizer/Builder/MutableBox.cpp
@@ -366,9 +366,9 @@ mlir::Value fir::factory::createUnallocatedBox(
fir::MutableBoxValue fir::factory::createTempMutableBox(
fir::FirOpBuilder &builder, mlir::Location loc, mlir::Type type,
- llvm::StringRef name, mlir::Value typeSourceBox) {
+ llvm::StringRef name, mlir::Value typeSourceBox, bool isPolymorphic) {
mlir::Type boxType;
- if (typeSourceBox)
+ if (typeSourceBox || isPolymorphic)
boxType = fir::ClassType::get(fir::HeapType::get(type));
else
boxType = fir::BoxType::get(fir::HeapType::get(type));
diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90
index dd023b9694ff1..67699bd32495f 100644
--- a/flang/test/Lower/polymorphic.f90
+++ b/flang/test/Lower/polymorphic.f90
@@ -1112,6 +1112,32 @@ subroutine class_with_entry(a)
! CHECK-SAME: %[[B:.*]]: !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>> {fir.bindc_name = "b"}) {
! CHECK: %[[A:.*]] = fir.alloca !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>> {bindc_name = "a", uniq_name = "_QMpolymorphic_testFclass_with_entryEa"}
+ subroutine class_array_with_entry(a)
+ class(p1) :: a(:), b(:)
+ select type (a)
+ type is(p2)
+ print*, a%c
+ class default
+ print*, a%a
+ end select
+ return
+ entry g(b)
+ select type(b)
+ type is(p2)
+ print*,b%c
+ class default
+ print*,b%a
+ end select
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPclass_array_with_entry(
+! CHECK-SAME: %[[A:.*]]: !fir.class<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>> {fir.bindc_name = "a"}) {
+! CHECK: %[[B:.*]] = fir.alloca !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>>>
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPg(
+! CHECK-SAME: %[[B:.*]]: !fir.class<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>> {fir.bindc_name = "b"}) {
+! CHECK: %[[A:.*]] = fir.alloca !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>>>
+
end module
program test
More information about the flang-commits
mailing list