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