1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s 2 3 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s 4 5 extern int omp_default_mem_alloc; 6 void foo() { 7 } 8 9 bool foobool(int argc) { 10 return argc; 11 } 12 13 struct S1; // expected-note {{declared here}} expected-note{{forward declaration of 'S1'}} 14 extern S1 a; 15 class S2 { 16 mutable int a; 17 public: 18 S2():a(0) { } 19 static float S2s; // expected-note {{static data member is predetermined as shared}} 20 }; 21 const S2 b; 22 const S2 ba[5]; 23 class S3 { 24 int a; 25 public: 26 S3():a(0) { } 27 }; 28 const S3 c; // expected-note {{'c' defined here}} 29 const S3 ca[5]; // expected-note {{'ca' defined here}} 30 extern const int f; // expected-note {{'f' declared here}} 31 class S4 { 32 int a; 33 S4(); // expected-note {{implicitly declared private here}} 34 public: 35 S4(int v):a(v) { } 36 }; 37 class S5 { 38 int a; 39 S5():a(0) {} // expected-note {{implicitly declared private here}} 40 public: 41 S5(int v):a(v) { } 42 }; 43 44 int threadvar; 45 #pragma omp threadprivate(threadvar) // expected-note {{defined as threadprivate or thread local}} 46 47 namespace A { 48 double x; 49 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} 50 } 51 namespace B { 52 using A::x; 53 } 54 55 int main(int argc, char **argv) { 56 const int d = 5; // expected-note {{'d' defined here}} 57 const int da[5] = { 0 }; // expected-note {{'da' defined here}} 58 S4 e(4); 59 S5 g[] = {5, 6}; 60 int i; 61 int &j = i; 62 #pragma omp parallel private // expected-error {{expected '(' after 'private'}} 63 #pragma omp parallel private ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 64 #pragma omp parallel private () // expected-error {{expected expression}} 65 #pragma omp parallel private (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 66 #pragma omp parallel private (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 67 #pragma omp parallel private (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 68 #pragma omp parallel private (argc argv) // expected-error {{expected ',' or ')' in 'private' clause}} 69 #pragma omp parallel private (S1) // expected-error {{'S1' does not refer to a value}} 70 #pragma omp parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be private}} expected-error 2 {{const-qualified variable cannot be private}} 71 #pragma omp parallel private (argv[1]) // expected-error {{expected variable name}} 72 #pragma omp parallel private(ba) allocate , allocate(, allocate(omp_default , allocate(omp_default_mem_alloc, allocate(omp_default_mem_alloc:, allocate(omp_default_mem_alloc: argc, allocate(omp_default_mem_alloc: argv), allocate(argv) // expected-error {{expected '(' after 'allocate'}} expected-error 2 {{expected expression}} expected-error 2 {{expected ')'}} expected-error {{use of undeclared identifier 'omp_default'}} expected-note 2 {{to match this '('}} 73 #pragma omp parallel private(ca) // expected-error {{const-qualified variable without mutable fields cannot be private}} 74 #pragma omp parallel private(da) // expected-error {{const-qualified variable cannot be private}} 75 #pragma omp parallel private(S2::S2s) // expected-error {{shared variable cannot be private}} 76 #pragma omp parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 77 #pragma omp parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 78 #pragma omp parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} 79 foo(); 80 #pragma omp parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} 81 foo(); 82 #pragma omp parallel private(i) 83 #pragma omp parallel private(j) 84 foo(); 85 #pragma omp parallel firstprivate(i) 86 for (int k = 0; k < 10; ++k) { 87 #pragma omp parallel private(i) 88 foo(); 89 } 90 static int m; 91 #pragma omp parallel private(m) // OK 92 foo(); 93 94 return 0; 95 } 96