1 // DEFINE: %{common_opts_mac} = -triple x86_64-apple-macos10.7.0 2 // DEFINE: %{limit} = -fnoopenmp-use-tls -ferror-limit 100 3 // DEFINE: %{target_mac} = -fopenmp-targets=x86_64-apple-macos10.7.0 4 // DEFINE: %{aux_triple} = -aux-triple x86_64-apple-macos10.7.0 5 // DEFINE: %{openmp45} = -fopenmp -fopenmp-version=45 6 // DEFINE: %{openmp50} = -fopenmp -fopenmp-version=50 7 // DEFINE: %{openmp50_simd} = -fopenmp-simd -fopenmp-version=50 8 // DEFINE: %{openmp52} = -fopenmp -fopenmp-version=52 9 // DEFINE: %{openmp60} = -fopenmp -fopenmp-version=60 10 // DEFINE: %{openmp60_simd} = -fopenmp-simd -fopenmp-version=60 11 12 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause,omp45-to-51-clause %{openmp45} %{limit} -o - %s 13 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50} %{target_mac} %{limit} -o - %s 14 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{target_mac} %{limit} -o - %s 15 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51,dev5 %{openmp50} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s 16 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s 17 18 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50_simd} %{target_mac} %{limit} -o - %s 19 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} %{target_mac} %{limit} -o - %s 20 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s 21 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s 22 23 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause -fopenmp-version=45 -fopenmp-simd %{limit} -o - %s 24 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s 25 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -DTESTEND=1 -o - %s 26 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -I%S/Inputs -DTESTENDINC=1 -o - %s 27 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp-simd %{limit} -o - %s 28 29 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp52} -DVERBOSE_MODE=1 %{limit} -o - %s 30 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -DVERBOSE_MODE=1 %{limit} -o - %s 31 32 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 %{openmp50} %{limit} -o - %s 33 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s 34 // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{limit} -o - %s 35 36 37 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}} 38 #pragma omp end declare target 39 40 // ompvar-error@+1 {{variable captured in declare target region must appear in a to clause}} 41 int a, b, z; 42 // expected-note@+1 {{defined as threadprivate or thread local}} 43 __thread int t; 44 45 // expected-error@+1 {{expected '(' after 'declare target'}} 46 #pragma omp declare target . 47 48 #pragma omp declare target 49 void f(); 50 // expected-warning@+1 {{extra tokens at the end of '#pragma omp end declare target' are ignored}} 51 #pragma omp end declare target shared(a) 52 53 // omp52-error@+8 {{unexpected 'map' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}} 54 // omp52-error@+7 {{expected at least one 'enter', 'link' or 'indirect' clause}} 55 // omp51-error@+6 {{unexpected 'map' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}} 56 // omp51-error@+5 {{expected at least one 'to', 'link' or 'indirect' clause}} 57 // omp5-error@+4 {{unexpected 'map' clause, only 'to', 'link' or 'device_type' clauses expected}} 58 // omp5-error@+3 {{expected at least one 'to' or 'link' clause}} 59 // omp45-error@+2 {{unexpected 'map' clause, only 'to' or 'link' clauses expected}} 60 // omp45-error@+1 {{expected at least one 'to' or 'link' clause}} 61 #pragma omp declare target map(a) 62 63 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}} 64 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}} 65 // omp45-to-51-error@+1 {{use of undeclared identifier 'foo1'}} 66 #pragma omp declare target to(foo1) 67 68 // expected-error@+1 {{use of undeclared identifier 'foo2'}} 69 #pragma omp declare target link(foo2) 70 71 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}} 72 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}} 73 // dev5-note@+2 {{marked as 'device_type(host)' here}} 74 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 75 #pragma omp declare target to(f) device_type(host) 76 77 void q(); 78 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}} 79 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}} 80 // omp5-and-51-warning@+2 {{more than one 'device_type' clause is specified}} 81 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 82 #pragma omp declare target to(q) device_type(any) device_type(any) device_type(host) 83 84 #if _OPENMP == 202011 85 // omp51-error@+1 {{directive '#pragma omp declare target' cannot contain more than one 'indirect' clause}} 86 #pragma omp declare target to(q) indirect(true) indirect(false) 87 88 // expected-note@+1 {{declared here}} 89 int xxx; 90 // omp51-error@+2 {{expression is not an integral constant expression}} 91 // omp51-note@+1 {{read of non-const variable 'xxx' is not allowed in a constant expression}} 92 #pragma omp declare target to(q) indirect(xxx) 93 94 constexpr bool fz() {return true;} 95 // omp51-error@+1 {{unexpected 'to' clause, only 'device_type', 'indirect' clauses expected}} 96 #pragma omp begin declare target to(q) indirect(fz()) device_type(nohost) 97 #pragma omp end declare target 98 99 // omp51-error@+1 {{unexpected 'to' clause, only 'device_type', 'indirect' clauses expected}} 100 #pragma omp begin declare target indirect to(xxx) 101 void bar(); 102 #pragma omp end declare target 103 104 // omp51-error@+2 {{unexpected 'tofrom' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}} 105 // omp51-error@+1 {{expected at least one 'to', 'link' or 'indirect' clause}} 106 #pragma omp declare target tofrom(xxx) 107 108 // omp51-error@+1 {{only 'device_type(any)' clause is allowed with indirect clause}} 109 #pragma omp begin declare target device_type(host) indirect 110 void bar(); 111 #pragma omp end declare target 112 #endif // _OPENMP 113 114 void c(); 115 116 // expected-note@+1 {{'func' defined here}} 117 void func() {} 118 119 // omp52-error@+5 {{unexpected 'allocate' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}} 120 // omp51-error@+4 {{unexpected 'allocate' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}} 121 // omp5-error@+3 {{unexpected 'allocate' clause, only 'to', 'link' or 'device_type' clauses expected}} 122 // expected-error@+2 {{function name is not allowed in 'link' clause}} 123 // omp45-error@+1 {{unexpected 'allocate' clause, only 'to' or 'link' clauses expected}} 124 #pragma omp declare target link(func) allocate(a) 125 126 void bar(); 127 void baz() {bar();} 128 // omp5-or-later-warning@+1 {{declaration marked as declare target after first use, it may lead to incorrect results}} 129 #pragma omp declare target(bar) 130 131 extern int b; 132 133 struct NonT { 134 int a; 135 }; 136 137 typedef int sint; 138 139 template <typename T> 140 T bla1() { return 0; } 141 142 #pragma omp declare target 143 template <typename T> 144 T bla2() { return 0; } 145 #pragma omp end declare target 146 147 template<> 148 float bla2() { return 1.0; } 149 150 #pragma omp declare target 151 void blub2() { 152 bla2<float>(); 153 bla2<int>(); 154 } 155 #pragma omp end declare target 156 157 void t2() { 158 #pragma omp target 159 { 160 bla2<float>(); 161 bla2<long>(); 162 } 163 } 164 165 #pragma omp declare target 166 void abc(); 167 #pragma omp end declare target 168 void cba(); 169 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}} 170 #pragma omp end declare target 171 172 #pragma omp declare target 173 #pragma omp declare target 174 void def(); 175 #pragma omp end declare target 176 void fed(); 177 178 #pragma omp declare target 179 // expected-note@+1 {{defined as threadprivate or thread local}} 180 #pragma omp threadprivate(a) 181 extern int b; 182 int g; 183 184 struct T { 185 int a; 186 virtual int method(); 187 }; 188 189 class VC { 190 T member; 191 NonT member1; 192 public: 193 virtual int method() { T a; return 0; } 194 }; 195 196 struct C { 197 NonT a; 198 sint b; 199 int method(); 200 int method1(); 201 }; 202 203 int C::method1() { 204 return 0; 205 } 206 207 void foo(int p) { 208 // expected-error@+1 {{threadprivate variables cannot be used in target constructs}} 209 a = 0; 210 b = 0; 211 // expected-error@+1 {{threadprivate variables cannot be used in target constructs}} 212 t = 1; 213 C object; 214 VC object1; 215 g = object.method(); 216 g += object.method1(); 217 g += object1.method() + p; 218 // dev5-error@+1 {{function with 'device_type(host)' is not available on device}} 219 f(); 220 q(); 221 c(); 222 } 223 #pragma omp declare target 224 void foo1() { 225 // omp5-or-later-var-note@+1 {{variable 'z' is captured here}} 226 [&](){ (void)(b+z);}(); 227 } 228 #pragma omp end declare target 229 230 #pragma omp end declare target 231 #pragma omp end declare target 232 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}} 233 #pragma omp end declare target 234 235 int C::method() { 236 return 0; 237 } 238 239 struct S { 240 #pragma omp declare target 241 int v; 242 #pragma omp end declare target 243 }; 244 245 void foo3() { 246 return; 247 } 248 249 int *y; 250 int **w = &y; 251 int main (int argc, char **argv) { 252 int a = 2; 253 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp declare target'}} 254 #pragma omp declare target 255 int v; 256 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}} 257 #pragma omp end declare target 258 foo(v); 259 260 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}} 261 // omp52-error@+1 {{unexpected 'to' clause, use 'enter' instead}} 262 #pragma omp declare target to(foo3) link(w) 263 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}} 264 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}} 265 // omp45-to-51-var-error@+1 {{local variable 'a' should not be used in 'declare target' directive}} 266 #pragma omp declare target to(a) 267 return (0); 268 } 269 270 namespace { 271 #pragma omp declare target 272 int x; 273 } 274 #pragma omp end declare target 275 276 // expected-error@+1 {{'S' used in declare target directive is not a variable or a function name}} 277 #pragma omp declare target link(S) 278 279 // expected-error@+1 {{'x' appears multiple times in clauses on the same declare target directive}} 280 #pragma omp declare target (x, x) 281 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}} 282 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}} 283 // omp45-to-51-clause-error@+1 {{'x' appears multiple times in clauses on the same declare target directive}} 284 #pragma omp declare target to(x) to(x) 285 // expected-error@+1 {{'x' must not appear in both clauses 'to' and 'link'}} 286 #pragma omp declare target link(x) 287 288 void bazz() {} 289 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}} 290 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}} 291 // host5-note@+2 3 {{marked as 'device_type(nohost)' here}} 292 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 293 #pragma omp declare target to(bazz) device_type(nohost) 294 void bazzz() {bazz();} 295 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}} 296 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}} 297 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 298 #pragma omp declare target to(bazzz) device_type(nohost) 299 // host5-error@+1 {{function with 'device_type(nohost)' is not available on host}} 300 void any() {bazz();} 301 // host5-error@+1 {{function with 'device_type(nohost)' is not available on host}} 302 void host1() {bazz();} 303 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}} 304 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}} 305 // dev5-note@+2 3 {{marked as 'device_type(host)' here}} 306 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 307 #pragma omp declare target to(host1) device_type(host) 308 //host5-error@+1 {{function with 'device_type(nohost)' is not available on host}} 309 void host2() {bazz();} 310 // omp52-error@+2 {{unexpected 'to' clause, use 'enter' instead}} 311 // omp52-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}} 312 #pragma omp declare target to(host2) 313 // dev5-error@+1 {{function with 'device_type(host)' is not available on device}} 314 void device() {host1();} 315 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}} 316 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}} 317 // host5-note@+2 2 {{marked as 'device_type(nohost)' here}} 318 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 319 #pragma omp declare target to(device) device_type(nohost) 320 void host3() {host1();} // dev5-error {{function with 'device_type(host)' is not available on device}} 321 // omp52-error@+2 {{unexpected 'to' clause, use 'enter' instead}} 322 // omp52-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}} 323 #pragma omp declare target to(host3) 324 325 #pragma omp declare target 326 void any1() {any();} 327 // dev5-error@+1 {{function with 'device_type(host)' is not available on device}} 328 void any2() {host1();} 329 // host5-error@+1 {{function with 'device_type(nohost)' is not available on host}} 330 void any3() {device();} 331 void any4() {any2();} 332 #pragma omp end declare target 333 334 void any5() {any();} 335 void any6() {host1();} 336 // host5-error@+1 {{function with 'device_type(nohost)' is not available on host}} 337 void any7() {device();} 338 void any8() {any2();} 339 340 int MultiDevTy; 341 // omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}} 342 // omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}} 343 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 344 #pragma omp declare target to(MultiDevTy) device_type(any) 345 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}} 346 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}} 347 // host-5-and-51-error@+2 {{'device_type(host)' does not match previously specified 'device_type(any)' for the same declaration}} 348 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 349 #pragma omp declare target to(MultiDevTy) device_type(host) 350 // omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}} 351 // omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}} 352 // no-host5-and-51-error@+2 {{'device_type(nohost)' does not match previously specified 'device_type(any)' for the same declaration}} 353 // omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} 354 #pragma omp declare target to(MultiDevTy) device_type(nohost) 355 356 // expected-warning@+1 {{declaration is not declared in any declare target region}} 357 static int variable = 100; 358 static float variable1 = 200; 359 // expected-warning@+1 {{declaration is not declared in any declare target region}} 360 static float variable2 = variable1; 361 362 // expected-warning@+1 {{declaration is not declared in any declare target region}} 363 static int var = 1; 364 365 static int var1 = 10; 366 static int *var2 = &var1; 367 // expected-warning@+1 {{declaration is not declared in any declare target region}} 368 static int **ptr1 = &var2; 369 370 int arr[2] = {1,2}; 371 // expected-warning@+1 {{declaration is not declared in any declare target region}} 372 int (*arrptr)[2] = &arr; 373 374 class declare{ 375 public: int x; 376 void print(); 377 }; 378 declare obj1; 379 // expected-warning@+1 {{declaration is not declared in any declare target region}} 380 declare *obj2 = &obj1; 381 382 struct target{ 383 int x; 384 void print(); 385 }; 386 // expected-warning@+1 {{declaration is not declared in any declare target region}} 387 static target S; 388 389 #pragma omp declare target 390 // expected-note@+1 {{used here}} 391 int target_var = variable; 392 // expected-note@+1 {{used here}} 393 float target_var1 = variable2; 394 // expected-note@+1 {{used here}} 395 int *ptr = &var; 396 // expected-note@+1 {{used here}} 397 int ***ptr2 = &ptr1; 398 // expected-note@+1 {{used here}} 399 int (**ptr3)[2] = &arrptr; 400 // expected-note@+1 {{used here}} 401 declare **obj3 = &obj2; 402 // expected-note@+1 {{used here}} 403 target *S1 = &S; 404 #pragma omp end declare target 405 406 #if TESTENDINC 407 #include "unterminated_declare_target_include.h" 408 #elif TESTEND 409 // expected-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp declare target'}} 410 #pragma omp declare target 411 #else 412 // expected-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare target'}} 413 #pragma omp begin declare target 414 #endif 415