|
| 1 | +! Test lowering of COPYPRIVATE with procedure pointers. |
| 2 | +! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s |
| 3 | + |
| 4 | +!CHICK-SAME: %arg0: [[TYPE:!fir.ref<!fir.boxproc<() -> i32>>>]], |
| 5 | + |
| 6 | +!CHECK-LABEL: func.func private @_copy_boxproc_i32_args( |
| 7 | +!CHECK-SAME: %arg0: [[TYPE:!fir.ref<!fir.boxproc<\(\) -> i32>>]], |
| 8 | +!CHECK-SAME: %arg1: [[TYPE]]) |
| 9 | +!CHECK: %[[DST:.*]]:2 = hlfir.declare %arg0 {{.*}} : ([[TYPE]]) -> ([[TYPE]], [[TYPE]]) |
| 10 | +!CHECK: %[[SRC:.*]]:2 = hlfir.declare %arg1 {{.*}} : ([[TYPE]]) -> ([[TYPE]], [[TYPE]]) |
| 11 | +!CHECK: %[[TEMP:.*]] = fir.load %[[SRC]]#0 : [[TYPE]] |
| 12 | +!CHECK: fir.store %[[TEMP]] to %[[DST]]#0 : [[TYPE]] |
| 13 | +!CHECK: return |
| 14 | + |
| 15 | +!CHECK-LABEL: func @_QPtest_proc_ptr |
| 16 | +!CHECK: omp.parallel |
| 17 | +!CHECK: omp.single copyprivate(%{{.*}}#0 -> @_copy_boxproc_i32_args : !fir.ref<!fir.boxproc<() -> i32>>) |
| 18 | +subroutine test_proc_ptr() |
| 19 | + interface |
| 20 | + function sub1() bind(c) result(ret) |
| 21 | + use, intrinsic :: iso_c_binding |
| 22 | + integer(c_int) :: ret |
| 23 | + end function sub1 |
| 24 | + end interface |
| 25 | + |
| 26 | + procedure(sub1), pointer, save, bind(c) :: ffunptr |
| 27 | + !$omp threadprivate(ffunptr) |
| 28 | + |
| 29 | + !$omp parallel |
| 30 | + ffunptr => sub1 |
| 31 | + !$omp single |
| 32 | + ffunptr => sub1 |
| 33 | + !$omp end single copyprivate(ffunptr) |
| 34 | + if (ffunptr() /= 1) print *, 'err' |
| 35 | + !$omp end parallel |
| 36 | +end subroutine |
| 37 | + |
| 38 | +function sub1() bind(c) result(ret) |
| 39 | + use, intrinsic::iso_c_binding |
| 40 | + integer(c_int) :: ret |
| 41 | + ret = 1 |
| 42 | +end function sub1 |
0 commit comments