[Flang][OpenMP] Fix COPYIN of derived types with allocatable components at -O3 (#196063)
COPYIN of threadprivate derived types with allocatable components
segfaults at -O3 because the OpenMP runtime zero-fills per-thread
storage, leaving allocatable component descriptors with invalid
metadata. This patch skips the copy on the master thread (where source
and destination alias) and uses temporary_lhs assignment on worker
threads so the runtime initializes descriptors before the deep copy.
Assisted-by: Claude Opus 4.6
Fixes :
[https://github.com/llvm/llvm-project/issues/196134](https://github.com/llvm/llvm-project/issues/196134)
Minimal reprducing test-case :
```
program repro_o3_segv
use omp_lib
implicit none
integer, parameter :: NT = 4
integer :: i, rc
integer :: nThreads(NT), nThreads1(NT)
type structure_1
integer, allocatable :: a(:)
end type
type structure_2
type(structure_1) :: struc1
end type
type(structure_2), save :: struc2(2)
!$omp threadprivate(struc2)
rc = 0
nThreads = -999
nThreads1 = -999
! Keep this: dynamic teams can change codegen/runtime behavior.
call omp_set_dynamic(.true.)
call omp_set_num_threads(NT)
allocate(struc2(1)%struc1%a(2))
struc2(1)%struc1%a(1) = 1
struc2(1)%struc1%a(2) = 2
!$omp parallel copyin(struc2)
if (omp_get_thread_num() == NT-1) then
! Keep branch shape from original.
! struc2(1)%struc1%a(1) = 3
end if
!$omp barrier
allocate(struc2(2)%struc1%a(3))
nThreads(omp_get_thread_num()+1) = struc2(1)%struc1%a(1)
struc2(2)%struc1%a(1) = omp_get_thread_num()+1
struc2(2)%struc1%a(2) = omp_get_thread_num()+2
!$omp end parallel
do i = 1, NT
if (nThreads(i) /= 1) rc = 1
end do
struc2(2)%struc1%a(2) = -1
!$omp parallel copyin(struc2)
nThreads(omp_get_thread_num()+1) = struc2(2)%struc1%a(1)
nThreads1(omp_get_thread_num()+1) = struc2(2)%struc1%a(2)
!$omp end parallel
do i = 1, NT
if (nThreads1(i) /= -1) rc = 1
end do
if (rc /= 0) stop 1
deallocate(struc2(1)%struc1%a)
deallocate(struc2(2)%struc1%a)
end program
```
[>./flang -fopenmp -fopenmp-version=50 copyin_derrived_alloct.f90 -O3
> ./a.out
Segmentation fault (core dumped)
Co-authored-by: Chandra Ghale <ghale@pe34genoa.hpc.amslabs.hpecorp.net>