1 // RUN: %clang_cc1 -verify -fopenmp %s 2 3 // RUN: %clang_cc1 -verify -fopenmp-simd %s 4 5 void foo() { 6 } 7 8 bool foobool(int argc) { 9 return argc; 10 } 11 12 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} 13 extern S1 a; 14 class S2 { 15 mutable int a; 16 17 public: 18 S2() : a(0) {} 19 }; 20 const S2 b; 21 const S2 ba[5]; 22 class S3 { 23 int a; 24 25 public: 26 S3() : a(0) {} 27 }; 28 const S3 ca[5]; 29 class S4 { 30 int a; 31 S4(); // expected-note {{implicitly declared private here}} 32 33 public: 34 S4(int v) : a(v) { 35 #pragma omp target 36 #pragma omp teams 37 #pragma omp distribute parallel for simd private(a) private(this->a) 38 for (int k = 0; k < v; ++k) 39 ++this->a; 40 } 41 }; 42 class S5 { 43 int a; 44 S5() : a(0) {} // expected-note {{implicitly declared private here}} 45 46 public: 47 S5(int v) : a(v) {} 48 S5 &operator=(S5 &s) { 49 #pragma omp target 50 #pragma omp teams 51 #pragma omp distribute parallel for simd private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}} 52 for (int k = 0; k < s.a; ++k) // expected-warning {{Non-trivial type 'S5' is mapped, only trivial types are guaranteed to be mapped correctly}} 53 ++s.a; 54 return *this; 55 } 56 }; 57 58 template <typename T> 59 class S6 { 60 public: 61 T a; 62 63 S6() : a(0) {} 64 S6(T v) : a(v) { 65 #pragma omp target 66 #pragma omp teams 67 #pragma omp distribute parallel for simd private(a) private(this->a) 68 for (int k = 0; k < v; ++k) 69 ++this->a; 70 } 71 S6 &operator=(S6 &s) { 72 #pragma omp target 73 #pragma omp teams 74 #pragma omp distribute parallel for simd private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}} 75 for (int k = 0; k < s.a; ++k) 76 ++s.a; 77 return *this; 78 } 79 }; 80 81 template <typename T> 82 class S7 : public T { 83 T a; 84 S7() : a(0) {} 85 86 public: 87 S7(T v) : a(v) { 88 #pragma omp target 89 #pragma omp teams 90 #pragma omp distribute parallel for simd private(a) private(this->a) private(T::a) 91 for (int k = 0; k < a.a; ++k) 92 ++this->a.a; 93 } 94 S7 &operator=(S7 &s) { 95 #pragma omp target 96 #pragma omp teams 97 #pragma omp distribute parallel for simd private(a) private(this->a) private(s.a) private(s.T::a) // expected-error 2 {{expected variable name or data member of current class}} 98 for (int k = 0; k < s.a.a; ++k) 99 ++s.a.a; 100 return *this; 101 } 102 }; 103 104 S3 h; 105 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} 106 107 template <class I, class C> 108 int foomain(I argc, C **argv) { 109 I e(4); 110 I g(5); 111 int i; 112 int &j = i; 113 #pragma omp target 114 #pragma omp teams 115 #pragma omp distribute parallel for simd private // expected-error {{expected '(' after 'private'}} 116 for (int k = 0; k < argc; ++k) 117 ++k; 118 #pragma omp target 119 #pragma omp teams 120 #pragma omp distribute parallel for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 121 for (int k = 0; k < argc; ++k) 122 ++k; 123 #pragma omp target 124 #pragma omp teams 125 #pragma omp distribute parallel for simd private() // expected-error {{expected expression}} 126 for (int k = 0; k < argc; ++k) 127 ++k; 128 #pragma omp target 129 #pragma omp teams 130 #pragma omp distribute parallel for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 131 for (int k = 0; k < argc; ++k) 132 ++k; 133 #pragma omp target 134 #pragma omp teams 135 #pragma omp distribute parallel for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 136 for (int k = 0; k < argc; ++k) 137 ++k; 138 #pragma omp target 139 #pragma omp teams 140 #pragma omp distribute parallel for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 141 for (int k = 0; k < argc; ++k) 142 ++k; 143 #pragma omp target 144 #pragma omp teams 145 #pragma omp distribute parallel for simd private(argc) 146 for (int k = 0; k < argc; ++k) 147 ++k; 148 #pragma omp target 149 #pragma omp teams 150 #pragma omp distribute parallel for simd private(S1) // expected-error {{'S1' does not refer to a value}} 151 for (int k = 0; k < argc; ++k) 152 ++k; 153 #pragma omp target 154 #pragma omp teams 155 #pragma omp distribute parallel for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 156 for (int k = 0; k < argc; ++k) 157 ++k; 158 #pragma omp target 159 #pragma omp teams 160 #pragma omp distribute parallel for simd private(argv[1]) // expected-error {{expected variable name}} 161 for (int k = 0; k < argc; ++k) 162 ++k; 163 #pragma omp target 164 #pragma omp teams 165 #pragma omp distribute parallel for simd private(e, g) 166 for (int k = 0; k < argc; ++k) 167 ++k; 168 #pragma omp target 169 #pragma omp teams 170 #pragma omp distribute parallel for simd private(h) // expected-error {{threadprivate or thread local variable cannot be private}} 171 for (int k = 0; k < argc; ++k) 172 ++k; 173 #pragma omp target 174 #pragma omp teams 175 #pragma omp distribute parallel for simd nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp distribute parallel for simd'}} 176 for (int k = 0; k < argc; ++k) 177 ++k; 178 #pragma omp parallel 179 { 180 int v = 0; 181 int i; 182 #pragma omp target 183 #pragma omp teams 184 #pragma omp distribute parallel for simd private(i) 185 for (int k = 0; k < argc; ++k) { 186 i = k; 187 v += i; 188 } 189 } 190 #pragma omp parallel shared(i) 191 #pragma omp parallel private(i) 192 #pragma omp target 193 #pragma omp teams 194 #pragma omp distribute parallel for simd private(j) 195 for (int k = 0; k < argc; ++k) 196 ++k; 197 #pragma omp target 198 #pragma omp teams 199 #pragma omp distribute parallel for simd private(i) 200 for (int k = 0; k < argc; ++k) 201 ++k; 202 return 0; 203 } 204 205 namespace A { 206 double x; 207 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} 208 } 209 namespace B { 210 using A::x; 211 } 212 213 int main(int argc, char **argv) { 214 S4 e(4); 215 S5 g(5); 216 S6<float> s6(0.0) , s6_0(1.0); 217 S7<S6<float> > s7(0.0) , s7_0(1.0); 218 int i; 219 int &j = i; 220 #pragma omp target 221 #pragma omp teams 222 #pragma omp distribute parallel for simd private // expected-error {{expected '(' after 'private'}} 223 for (int k = 0; k < argc; ++k) 224 ++k; 225 #pragma omp target 226 #pragma omp teams 227 #pragma omp distribute parallel for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 228 for (int k = 0; k < argc; ++k) 229 ++k; 230 #pragma omp target 231 #pragma omp teams 232 #pragma omp distribute parallel for simd private() // expected-error {{expected expression}} 233 for (int k = 0; k < argc; ++k) 234 ++k; 235 #pragma omp target 236 #pragma omp teams 237 #pragma omp distribute parallel for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 238 for (int k = 0; k < argc; ++k) 239 ++k; 240 #pragma omp target 241 #pragma omp teams 242 #pragma omp distribute parallel for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 243 for (int k = 0; k < argc; ++k) 244 ++k; 245 #pragma omp target 246 #pragma omp teams 247 #pragma omp distribute parallel for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 248 for (int k = 0; k < argc; ++k) 249 ++k; 250 #pragma omp target 251 #pragma omp teams 252 #pragma omp distribute parallel for simd private(argc) 253 for (int k = 0; k < argc; ++k) 254 ++k; 255 #pragma omp target 256 #pragma omp teams 257 #pragma omp distribute parallel for simd private(S1) // expected-error {{'S1' does not refer to a value}} 258 for (int k = 0; k < argc; ++k) 259 ++k; 260 #pragma omp target 261 #pragma omp teams 262 #pragma omp distribute parallel for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 263 for (int k = 0; k < argc; ++k) 264 ++k; 265 #pragma omp target 266 #pragma omp teams 267 #pragma omp distribute parallel for simd private(argv[1]) // expected-error {{expected variable name}} 268 for (int k = 0; k < argc; ++k) 269 ++k; 270 #pragma omp target 271 #pragma omp teams 272 #pragma omp distribute parallel for simd private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 273 for (int k = 0; k < argc; ++k) 274 ++k; 275 #pragma omp target 276 #pragma omp teams 277 #pragma omp distribute parallel for simd private(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 278 for (int k = 0; k < argc; ++k) 279 ++k; 280 #pragma omp target 281 #pragma omp teams 282 #pragma omp distribute parallel for simd nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp distribute parallel for simd'}} 283 for (int k = 0; k < argc; ++k) 284 ++k; 285 #pragma omp parallel 286 { 287 int i; 288 #pragma omp target 289 #pragma omp teams 290 #pragma omp distribute parallel for simd private(i) 291 for (int k = 0; k < argc; ++k) 292 ++k; 293 } 294 #pragma omp parallel shared(i) 295 #pragma omp parallel private(i) 296 #pragma omp target 297 #pragma omp teams 298 #pragma omp distribute parallel for simd private(j) 299 for (int k = 0; k < argc; ++k) 300 ++k; 301 #pragma omp target 302 #pragma omp teams 303 #pragma omp distribute parallel for simd private(i) 304 for (int k = 0; k < argc; ++k) 305 ++k; 306 static int m; 307 #pragma omp target 308 #pragma omp teams 309 #pragma omp distribute parallel for simd private(m) 310 for (int k = 0; k < argc; ++k) 311 m = k + 2; 312 313 s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}} 314 s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float> >::operator=' requested here}} 315 return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}} 316 } 317 318