diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index c7bf424815548..37f51d74d23f8 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -833,7 +833,11 @@ class FirConverter : public Fortran::lower::AbstractConverter { if_builder.end(); }, [&](const auto &) -> void { - if (skipDefaultInit) + // Always initialize allocatable component descriptor, even when the + // value is later copied from the host (e.g. firstprivate) because the + // assignment from the host to the copy will fail if the component + // descriptors are not initialized. + if (skipDefaultInit && !hlfir::mayHaveAllocatableComponent(hSymType)) return; // Initialize local/private derived types with default // initialization (Fortran 2023 section 11.1.7.5 and OpenMP 5.2 diff --git a/flang/test/Lower/OpenMP/firstprivate-alloc-comp.f90 b/flang/test/Lower/OpenMP/firstprivate-alloc-comp.f90 new file mode 100644 index 0000000000000..2453fe2c5208b --- /dev/null +++ b/flang/test/Lower/OpenMP/firstprivate-alloc-comp.f90 @@ -0,0 +1,19 @@ +! Test delayed privatization for derived types with allocatable components. +! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s | FileCheck %s + +subroutine firstprivate_alloc_comp + type t1 + integer, allocatable :: c(:) + end type + type(t1) :: x + !$omp parallel firstprivate(x) + print *, allocated(x%c) + !$omp end parallel +end + + call firstprivate_alloc_comp() +end +! CHECK-LABEL: omp.private {type = firstprivate} @_QFfirstprivate_alloc_compEx_firstprivate_ref_rec__QFfirstprivate_alloc_compTt1 : !fir.ref>>}>> alloc { +! CHECK: fir.call @_FortranAInitialize( +! CHECK: } copy { +! ...