1*411bd2d4SPeixin-Qiao! This test checks lowering of OpenMP Threadprivate Directive.
2*411bd2d4SPeixin-Qiao! Test for character, array, and character array.
3*411bd2d4SPeixin-Qiao
4*411bd2d4SPeixin-Qiao!RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | FileCheck %s
5*411bd2d4SPeixin-Qiao
6*411bd2d4SPeixin-Qiaomodule test
7*411bd2d4SPeixin-Qiao  character :: x
8*411bd2d4SPeixin-Qiao  integer :: y(5)
9*411bd2d4SPeixin-Qiao  character(5) :: z(5)
10*411bd2d4SPeixin-Qiao
11*411bd2d4SPeixin-Qiao  !$omp threadprivate(x, y, z)
12*411bd2d4SPeixin-Qiao
13*411bd2d4SPeixin-Qiao!CHECK-DAG: fir.global @_QMtestEx : !fir.char<1> {
14*411bd2d4SPeixin-Qiao!CHECK-DAG: fir.global @_QMtestEy : !fir.array<5xi32> {
15*411bd2d4SPeixin-Qiao!CHECK-DAG: fir.global @_QMtestEz : !fir.array<5x!fir.char<1,5>> {
16*411bd2d4SPeixin-Qiao
17*411bd2d4SPeixin-Qiaocontains
18*411bd2d4SPeixin-Qiao  subroutine sub()
19*411bd2d4SPeixin-Qiao!CHECK-DAG:  [[ADDR0:%.*]] = fir.address_of(@_QMtestEx) : !fir.ref<!fir.char<1>>
20*411bd2d4SPeixin-Qiao!CHECK-DAG:  [[NEWADDR0:%.*]] = omp.threadprivate [[ADDR0]] : !fir.ref<!fir.char<1>> -> !fir.ref<!fir.char<1>>
21*411bd2d4SPeixin-Qiao!CHECK-DAG:  [[ADDR1:%.*]] = fir.address_of(@_QMtestEy) : !fir.ref<!fir.array<5xi32>>
22*411bd2d4SPeixin-Qiao!CHECK-DAG:  [[NEWADDR1:%.*]] = omp.threadprivate [[ADDR1]] : !fir.ref<!fir.array<5xi32>> -> !fir.ref<!fir.array<5xi32>>
23*411bd2d4SPeixin-Qiao!CHECK-DAG:  [[ADDR2:%.*]] = fir.address_of(@_QMtestEz) : !fir.ref<!fir.array<5x!fir.char<1,5>>>
24*411bd2d4SPeixin-Qiao!CHECK-DAG:  [[NEWADDR2:%.*]] = omp.threadprivate [[ADDR2]] : !fir.ref<!fir.array<5x!fir.char<1,5>>> -> !fir.ref<!fir.array<5x!fir.char<1,5>>>
25*411bd2d4SPeixin-Qiao!CHECK-DAG:  %{{.*}} = fir.convert [[NEWADDR0]] : (!fir.ref<!fir.char<1>>) -> !fir.ref<i8>
26*411bd2d4SPeixin-Qiao!CHECK-DAG:  %{{.*}} = fir.embox [[NEWADDR1]](%{{.*}}) : (!fir.ref<!fir.array<5xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<5xi32>>
27*411bd2d4SPeixin-Qiao!CHECK-DAG:  %{{.*}} = fir.embox [[NEWADDR2]](%{{.*}}) : (!fir.ref<!fir.array<5x!fir.char<1,5>>>, !fir.shape<1>) -> !fir.box<!fir.array<5x!fir.char<1,5>>>
28*411bd2d4SPeixin-Qiao    print *, x, y, z
29*411bd2d4SPeixin-Qiao
30*411bd2d4SPeixin-Qiao    !$omp parallel
31*411bd2d4SPeixin-Qiao!CHECK-DAG:    [[ADDR33:%.*]] = omp.threadprivate [[ADDR0]] : !fir.ref<!fir.char<1>> -> !fir.ref<!fir.char<1>>
32*411bd2d4SPeixin-Qiao!CHECK-DAG:    [[ADDR34:%.*]] = omp.threadprivate [[ADDR1]] : !fir.ref<!fir.array<5xi32>> -> !fir.ref<!fir.array<5xi32>>
33*411bd2d4SPeixin-Qiao!CHECK-DAG:    [[ADDR35:%.*]] = omp.threadprivate [[ADDR2]] : !fir.ref<!fir.array<5x!fir.char<1,5>>> -> !fir.ref<!fir.array<5x!fir.char<1,5>>>
34*411bd2d4SPeixin-Qiao!CHECK-DAG:    %{{.*}} = fir.convert [[ADDR33]] : (!fir.ref<!fir.char<1>>) -> !fir.ref<i8>
35*411bd2d4SPeixin-Qiao!CHECK-DAG:    %{{.*}} = fir.embox [[ADDR34]](%{{.*}}) : (!fir.ref<!fir.array<5xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<5xi32>>
36*411bd2d4SPeixin-Qiao!CHECK-DAG:    %{{.*}} = fir.embox [[ADDR35]](%{{.*}}) : (!fir.ref<!fir.array<5x!fir.char<1,5>>>, !fir.shape<1>) -> !fir.box<!fir.array<5x!fir.char<1,5>>>
37*411bd2d4SPeixin-Qiao      print *, x, y, z
38*411bd2d4SPeixin-Qiao    !$omp end parallel
39*411bd2d4SPeixin-Qiao
40*411bd2d4SPeixin-Qiao!CHECK-DAG:  %{{.*}} = fir.convert [[NEWADDR0]] : (!fir.ref<!fir.char<1>>) -> !fir.ref<i8>
41*411bd2d4SPeixin-Qiao!CHECK-DAG:  %{{.*}} = fir.embox [[NEWADDR1]](%{{.*}}) : (!fir.ref<!fir.array<5xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<5xi32>>
42*411bd2d4SPeixin-Qiao!CHECK-DAG:  %{{.*}} = fir.embox [[NEWADDR2]](%{{.*}}) : (!fir.ref<!fir.array<5x!fir.char<1,5>>>, !fir.shape<1>) -> !fir.box<!fir.array<5x!fir.char<1,5>>>
43*411bd2d4SPeixin-Qiao    print *, x, y, z
44*411bd2d4SPeixin-Qiao
45*411bd2d4SPeixin-Qiao  end
46*411bd2d4SPeixin-Qiaoend
47