1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8 // expected-no-diagnostics
9 
10 #ifndef HEADER
11 #define HEADER
12 
13 void foo() {}
14 
15 template <typename T, int C>
16 T tmain(T argc, T *argv) {
17   T i, j, b, c, d, e, x[20];
18 
19 #pragma omp target data map(to: c)
20   i = argc;
21 
22 #pragma omp target data map(to: c) if (target data: j > 0)
23   foo();
24 
25 #pragma omp target data map(to: c) if (b)
26   foo();
27 
28 #pragma omp target data map(c)
29   foo();
30 
31 #pragma omp target data map(c) if(b>e)
32   foo();
33 
34 #pragma omp target data map(x[0:10], c)
35   foo();
36 
37 #pragma omp target data map(to: c) map(from: d)
38   foo();
39 
40 #pragma omp target data map(always,alloc: e)
41   foo();
42 
43 // nesting a target region
44 #pragma omp target data map(e)
45 {
46   #pragma omp target map(always, alloc: e)
47     foo();
48 }
49 
50   return 0;
51 }
52 
53 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
54 // CHECK-NEXT: T i, j, b, c, d, e, x[20];
55 // CHECK-NEXT: #pragma omp target data map(to: c){{$}}
56 // CHECK-NEXT: i = argc;
57 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
58 // CHECK-NEXT: foo();
59 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
60 // CHECK-NEXT: foo();
61 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
62 // CHECK-NEXT: foo();
63 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
64 // CHECK-NEXT: foo();
65 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
66 // CHECK-NEXT: foo();
67 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
68 // CHECK-NEXT: foo();
69 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
70 // CHECK-NEXT: foo();
71 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
72 // CHECK-NEXT: {
73 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
74 // CHECK-NEXT: foo();
75 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
76 // CHECK-NEXT: int i, j, b, c, d, e, x[20];
77 // CHECK-NEXT: #pragma omp target data map(to: c)
78 // CHECK-NEXT: i = argc;
79 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
80 // CHECK-NEXT: foo();
81 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
82 // CHECK-NEXT: foo();
83 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
84 // CHECK-NEXT: foo();
85 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
86 // CHECK-NEXT: foo();
87 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
88 // CHECK-NEXT: foo();
89 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
90 // CHECK-NEXT: foo();
91 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
92 // CHECK-NEXT: foo();
93 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
94 // CHECK-NEXT: {
95 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
96 // CHECK-NEXT: foo();
97 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
98 // CHECK-NEXT: char i, j, b, c, d, e, x[20];
99 // CHECK-NEXT: #pragma omp target data map(to: c)
100 // CHECK-NEXT: i = argc;
101 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
102 // CHECK-NEXT: foo();
103 // CHECK-NEXT: #pragma omp target data map(to: c) if(b)
104 // CHECK-NEXT: foo();
105 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
106 // CHECK-NEXT: foo();
107 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)
108 // CHECK-NEXT: foo();
109 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
110 // CHECK-NEXT: foo();
111 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
112 // CHECK-NEXT: foo();
113 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
114 // CHECK-NEXT: foo();
115 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
116 // CHECK-NEXT: {
117 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
118 // CHECK-NEXT: foo();
119 
120 int main (int argc, char **argv) {
121   int b = argc, c, d, e, f, g, x[20];
122   static int a;
123 // CHECK: static int a;
124 
125 #pragma omp target data map(to: c)
126 // CHECK:      #pragma omp target data map(to: c)
127   a=2;
128 // CHECK-NEXT: a = 2;
129 #pragma omp target data map(to: c) if (target data: b)
130 // CHECK: #pragma omp target data map(to: c) if(target data: b)
131   foo();
132 // CHECK-NEXT: foo();
133 
134 #pragma omp target data map(to: c) if (b > g)
135 // CHECK: #pragma omp target data map(to: c) if(b > g)
136   foo();
137 // CHECK-NEXT: foo();
138 
139 #pragma omp target data map(c)
140 // CHECK-NEXT: #pragma omp target data map(tofrom: c)
141   foo();
142 // CHECK-NEXT: foo();
143 
144 #pragma omp target data map(c) if(b>g)
145 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g)
146   foo();
147 // CHECK-NEXT: foo();
148 
149 #pragma omp target data map(x[0:10], c)
150 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)
151   foo();
152 // CHECK-NEXT: foo();
153 
154 #pragma omp target data map(to: c) map(from: d)
155 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)
156   foo();
157 // CHECK-NEXT: foo();
158 
159 #pragma omp target data map(always,alloc: e)
160 // CHECK-NEXT: #pragma omp target data map(always,alloc: e)
161   foo();
162 // CHECK-NEXT: foo();
163 
164 // nesting a target region
165 #pragma omp target data map(e)
166 // CHECK-NEXT: #pragma omp target data map(tofrom: e)
167 {
168 // CHECK-NEXT: {
169   #pragma omp target map(always, alloc: e)
170 // CHECK-NEXT: #pragma omp target map(always,alloc: e)
171     foo();
172 // CHECK-NEXT: foo();
173 }
174   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
175 }
176 
177 #endif
178