1 // RUN: %clang_cc1 -std=c++11 -verify -fopenmp -ferror-limit 200 %s -Wuninitialized
2 
3 // RUN: %clang_cc1 -std=c++11 -verify -fopenmp-simd -ferror-limit 200 %s -Wuninitialized
4 struct ST {
5   int *a;
6 };
7 struct SA {
8   const int d = 5;
9   const int da[5] = { 0 };
10   ST e;
11   ST g[10];
12   int i;
13   int &j = i;
14   int *k = &j;
15   int *&z = k;
16   int aa[10];
funcSA17   void func(int arg) {
18 #pragma omp target data map(i) use_device_ptr // expected-error {{expected '(' after 'use_device_ptr'}}
19     {}
20 #pragma omp target data map(i) use_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}}
21     {}
22 #pragma omp target data map(i) use_device_ptr() // expected-error {{expected expression}}
23     {}
24 #pragma omp target data map(i) use_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}}
25     {}
26 #pragma omp target data map(i) use_device_ptr(arg // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
27     {}
28 #pragma omp target data map(i) use_device_ptr(i) // expected-error {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
29     {}
30 #pragma omp target data map(i) use_device_ptr(j) // expected-error {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
31     {}
32 #pragma omp target data map(i) use_device_ptr(k) // OK
33     {}
34 #pragma omp target data map(i) use_device_ptr(z) // OK
35     {}
36 #pragma omp target data map(i) use_device_ptr(aa) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
37     {}
38 #pragma omp target data map(i) use_device_ptr(e) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
39     {}
40 #pragma omp target data map(i) use_device_ptr(g) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
41     {}
42 #pragma omp target data map(i) use_device_ptr(k,i,j) // expected-error2 {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
43     {}
44 #pragma omp target data map(i) use_device_ptr(d) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
45     {}
46 #pragma omp target data map(i) use_device_ptr(da) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
47     {}
48   return;
49  }
50 };
51 struct SB {
52   unsigned A;
53   unsigned B;
54   float Arr[100];
55   float *Ptr;
fooSB56   float *foo() {
57     return &Arr[0];
58   }
59 };
60 
61 struct SC {
62   unsigned A : 2;
63   unsigned B : 3;
64   unsigned C;
65   unsigned D;
66   float Arr[100];
67   SB S;
68   SB ArrS[100];
69   SB *PtrS;
70   SB *&RPtrS;
71   float *Ptr;
72 
SCSC73   SC(SB *&_RPtrS) : RPtrS(_RPtrS) {}
74 };
75 
76 union SD {
77   unsigned A;
78   float B;
79 };
80 
81 struct S1;
82 extern S1 a;
83 class S2 {
84   mutable int a;
85 public:
S2()86   S2():a(0) { }
S2(S2 & s2)87   S2(S2 &s2):a(s2.a) { }
88   static float S2s;
89   static const float S2sc;
90 };
91 const float S2::S2sc = 0;
92 const S2 b;
93 const S2 ba[5];
94 class S3 {
95   int a;
96 public:
S3()97   S3():a(0) { }
S3(S3 & s3)98   S3(S3 &s3):a(s3.a) { }
99 };
100 const S3 c;
101 const S3 ca[5];
102 extern const int f;
103 class S4 {
104   int a;
105   S4();
106   S4(const S4 &s4);
107 public:
S4(int v)108   S4(int v):a(v) { }
109 };
110 class S5 {
111   int a;
S5()112   S5():a(0) {}
S5(const S5 & s5)113   S5(const S5 &s5):a(s5.a) { }
114 public:
S5(int v)115   S5(int v):a(v) { }
116 };
117 
118 S3 h;
119 #pragma omp threadprivate(h)
120 
121 typedef int from;
122 
123 template <typename T, int I>
124 T tmain(T argc) {
125   const T d = 5;
126   const T da[5] = { 0 };
127   S4 e(4);
128   S5 g(5);
129   T i;
130   T &j = i;
131   T *k = &j;
132   T *&z = k;
133   T aa[10];
134 #pragma omp target data map(i) use_device_ptr // expected-error {{expected '(' after 'use_device_ptr'}}
135   {}
136 #pragma omp target data map(i) use_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}}
137   {}
138 #pragma omp target data map(i) use_device_ptr() // expected-error {{expected expression}}
139   {}
140 #pragma omp target data map(i) use_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}}
141   {}
142 #pragma omp target data map(i) use_device_ptr(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
143   {}
144 #pragma omp target data map(i) use_device_ptr(i) // expected-error {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
145   {}
146 #pragma omp target data map(i) use_device_ptr(j) // expected-error {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
147   {}
148 #pragma omp target data map(i) use_device_ptr(k) // OK
149   {}
150 #pragma omp target data map(i) use_device_ptr(z) // OK
151   {}
152 #pragma omp target data map(i) use_device_ptr(aa) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
153   {}
154 #pragma omp target data map(i) use_device_ptr(e) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
155   {}
156 #pragma omp target data map(i) use_device_ptr(g) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
157   {}
158 #pragma omp target data map(i) use_device_ptr(k,i,j) // expected-error2 {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
159   {}
160 #pragma omp target data map(i) use_device_ptr(d) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
161   {}
162 #pragma omp target data map(i) use_device_ptr(da) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
163   {}
164   return 0;
165 }
166 
main(int argc,char ** argv)167 int main(int argc, char **argv) {
168   const int d = 5;
169   const int da[5] = { 0 };
170   S4 e(4);
171   S5 g(5);
172   int i;
173   int &j = i;
174   int *k = &j;
175   int *&z = k;
176   int aa[10];
177 #pragma omp target data map(i) use_device_ptr // expected-error {{expected '(' after 'use_device_ptr'}}
178   {}
179 #pragma omp target data map(i) use_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}}
180   {}
181 #pragma omp target data map(i) use_device_ptr() // expected-error {{expected expression}}
182   {}
183 #pragma omp target data map(i) use_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}}
184   {}
185 #pragma omp target data map(i) use_device_ptr(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
186   {}
187 #pragma omp target data map(i) use_device_ptr(i) // expected-error {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
188   {}
189 #pragma omp target data map(i) use_device_ptr(j) // expected-error {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
190   {}
191 #pragma omp target data map(i) use_device_ptr(k) // OK
192   {}
193 #pragma omp target data map(i) use_device_ptr(z) // OK
194   {}
195 #pragma omp target data map(i) use_device_ptr(aa) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
196   {}
197 #pragma omp target data map(i) use_device_ptr(e) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
198   {}
199 #pragma omp target data map(i) use_device_ptr(g) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
200   {}
201 #pragma omp target data map(i) use_device_ptr(k,i,j) // expected-error2 {{expected pointer or reference to pointer in 'use_device_ptr' clause}}
202   {}
203 #pragma omp target data map(i) use_device_ptr(d) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
204   {}
205 #pragma omp target data map(i) use_device_ptr(da) // expected-error{{expected pointer or reference to pointer in 'use_device_ptr' clause}}
206   {}
207   return tmain<int, 3>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}}
208 }
209