! RUN: %flang_fc1 -emit-hlfir -o - -fopenmp %s | FileCheck %s ! RUN: bbc -emit-hlfir -o - -fopenmp %s | FileCheck %s ! CHECK-LABEL: func.func @_QQmain() ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.box> {bindc_name = "a", uniq_name = "_QFEa"} ! CHECK: %[[VAL_1:.*]] = fir.zero_bits !fir.heap ! CHECK: %[[VAL_2:.*]] = fir.embox %[[VAL_1]] : (!fir.heap) -> !fir.box> ! CHECK: fir.store %[[VAL_2]] to %[[VAL_0]] : !fir.ref>> ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = {{.*}}, uniq_name = "_QFEa"} : (!fir.ref>>) -> (!fir.ref>>, !fir.ref>>) ! CHECK: omp.parallel { ! create original copy of private variable ! CHECK: %[[VAL_16:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = {{.*}}, uniq_name = "_QFEa"} : (!fir.ref>>) -> (!fir.ref>>, !fir.ref>>) ! CHECK: %[[VAL_17:.*]] = fir.alloca i32 {bindc_name = "i", pinned, uniq_name = "_QFEi"} ! CHECK: %[[VAL_18:.*]]:2 = hlfir.declare %[[VAL_17]] {uniq_name = "_QFEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) ! CHECK: omp.wsloop { ! CHECK: omp.loop_nest ! [...] ! if this is the last iteration ! CHECK: fir.if %{{.*}} { ! store loop IV ! CHECK: fir.store %{{.*}} to %[[VAL_18]]#1 : !fir.ref ! assign private variable to original copy: realloc ! CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_16]]#0 : !fir.ref>> ! CHECK: %[[VAL_24:.*]] = fir.box_addr %[[VAL_23]] : (!fir.box>) -> !fir.heap ! CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_24]] : !fir.heap ! CHECK: hlfir.assign %[[VAL_25]] to %[[VAL_3]]#0 realloc : i32, !fir.ref>> ! CHECK-NEXT: } ! CHECK-NEXT: omp.yield ! CHECK-NEXT: } program lastprivate_allocatable integer, allocatable :: a integer :: i ! a is unallocated here !$omp parallel do lastprivate(a) do i=1,1 a = 42 enddo !$omp end parallel do ! a should be allocated here end program ! CHECK-LABEL: func @_QPlastprivate_realloc() ! CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs, uniq_name = "_QFlastprivate_reallocEa"} : ! CHECK-SAME: (!fir.ref>>>>) -> ! CHECK-SAME: (!fir.ref>>>>, !fir.ref>>>>) ! CHECK: omp.parallel { ! CHECK: %[[A_PRIV:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs, uniq_name = "_QFlastprivate_reallocEa"} : ! CHECK-SAME: (!fir.ref>>>>) -> ! CHECK-SAME: (!fir.ref>>>>, !fir.ref>>>>) ! CHECK: omp.sections { ! CHECK: omp.section { ! CHECK: %[[TEMP:.*]] = fir.load %[[A_PRIV:.*]]#0 : !fir.ref>>>> ! CHECK: hlfir.assign %[[TEMP]] to %[[A]]#0 realloc : !fir.box>>>, ! CHECK-SAME: !fir.ref>>>> ! CHECK: } ! CHECK: } ! CHECK: } subroutine lastprivate_realloc() complex, allocatable :: a(:) allocate(a(2)) !$omp parallel !$omp sections lastprivate(a) !$omp section deallocate(a) allocate(a(3)) !$omp end sections !$omp end parallel end subroutine