[flang-commits] [flang] fdc3dd7 - [flang] Add runtime default initialization for polymorphic intent(out) dummy
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Mon Jan 9 08:53:47 PST 2023
Author: Valentin Clement
Date: 2023-01-09T17:53:41+01:00
New Revision: fdc3dd70c7304e1352201fee85429d07380a96bb
URL: https://github.com/llvm/llvm-project/commit/fdc3dd70c7304e1352201fee85429d07380a96bb
DIFF: https://github.com/llvm/llvm-project/commit/fdc3dd70c7304e1352201fee85429d07380a96bb.diff
LOG: [flang] Add runtime default initialization for polymorphic intent(out) dummy
This patch adds runtime default initialization for polymorphic
dummy argument. The dynamic type might require default initialization
but not the declared type.
Reviewed By: jeanPerier, PeteSteinfeld
Differential Revision: https://reviews.llvm.org/D141278
Added:
Modified:
flang/lib/Lower/ConvertVariable.cpp
flang/test/Lower/polymorphic.f90
Removed:
################################################################################
diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index ad586cab7c4f3..bc579a0eeb435 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -625,6 +625,11 @@ mustBeDefaultInitializedAtRuntime(const Fortran::lower::pft::Variable &var) {
return false;
if (Fortran::semantics::IsDummy(sym) && !Fortran::semantics::IsIntentOut(sym))
return false;
+ // Polymorphic intent(out) dummy might need default initialization
+ // at runtime.
+ if (Fortran::semantics::IsPolymorphic(sym) &&
+ Fortran::semantics::IsDummy(sym) && Fortran::semantics::IsIntentOut(sym))
+ return true;
// Local variables (including function results), and intent(out) dummies must
// be default initialized at runtime if their type has default initialization.
return hasDefaultInitialization(sym);
diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90
index bd31cc75f8051..48c54a012c532 100644
--- a/flang/test/Lower/polymorphic.f90
+++ b/flang/test/Lower/polymorphic.f90
@@ -23,7 +23,7 @@ module polymorphic_test
end type
type, extends(p1) :: p2
- real :: c
+ real :: c = 10.5
end type
type r1
@@ -738,6 +738,24 @@ subroutine test_unlimited_polymorphic_alloc_array_ret()
! CHECK: %[[RES:.*]] = fir.call @_QMpolymorphic_testPunlimited_polymorphic_alloc_array_ret() fastmath<contract> : () -> !fir.class<!fir.heap<!fir.array<?xnone>>>
! CHECK: fir.save_result %[[RES]] to %[[RES_TMP]] : !fir.class<!fir.heap<!fir.array<?xnone>>>, !fir.ref<!fir.class<!fir.heap<!fir.array<?xnone>>>>
+ subroutine test_unlimited_polymorphic_intentout(a)
+ class(*), intent(out) :: a
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPtest_unlimited_polymorphic_intentout(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.class<none> {fir.bindc_name = "a"}) {
+! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[ARG0]] : (!fir.class<none>) -> !fir.box<none>
+! CHECK: %{{.*}} = fir.call @_FortranAInitialize(%[[BOX_NONE]], %{{.*}}, %{{.*}}) {{.*}} : (!fir.box<none>, !fir.ref<i8>, i32) -> none
+
+ subroutine test_polymorphic_intentout(a)
+ class(p1), intent(out) :: a
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPtest_polymorphic_intentout(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>> {fir.bindc_name = "a"}) {
+! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[ARG0]] : (!fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> !fir.box<none>
+! CHECK: %{{.*}} = fir.call @_FortranAInitialize(%[[BOX_NONE]], %{{.*}}, %{{.*}}) {{.*}} : (!fir.box<none>, !fir.ref<i8>, i32) -> none
+
end module
program test
More information about the flang-commits
mailing list