diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp --- a/flang/lib/Lower/ConvertVariable.cpp +++ b/flang/lib/Lower/ConvertVariable.cpp @@ -600,7 +600,10 @@ // Polymorphic intent(out) dummy might need default initialization // at runtime. if (Fortran::semantics::IsPolymorphic(sym) && - Fortran::semantics::IsDummy(sym) && Fortran::semantics::IsIntentOut(sym)) + Fortran::semantics::IsDummy(sym) && + Fortran::semantics::IsIntentOut(sym) && + !Fortran::semantics::IsAllocatable(sym) && + !Fortran::semantics::IsPointer(sym)) return true; // Local variables (including function results), and intent(out) dummies must // be default initialized at runtime if their type has default initialization. diff --git a/flang/test/Lower/default-initialization.f90 b/flang/test/Lower/default-initialization.f90 --- a/flang/test/Lower/default-initialization.f90 +++ b/flang/test/Lower/default-initialization.f90 @@ -1,5 +1,5 @@ ! Test default initialization of local and dummy variables (dynamic initialization) -! RUN: bbc -emit-fir %s -o - | FileCheck %s +! RUN: bbc -emit-fir -polymorphic-type %s -o - | FileCheck %s module test_dinit type t @@ -159,8 +159,19 @@ ! CHECK: return end subroutine + + subroutine test_pointer_intentout(a, b) + type(t), pointer, intent(out) :: a + class(t), pointer, intent(out) :: b + end subroutine + +! CHECK-LABEL: func.func @_QMtest_dinitPtest_pointer_intentout( +! CHECK-NOT: fir.call @_FortranAInitialize + end module +! CHECK-LABEL: func.func @_QQmain + ! End-to-end test for debug pruposes. use test_dinit type(t) :: at