1 // RUN: %clang_cc1 -verify -fopenmp %s 2 3 // RUN: %clang_cc1 -verify -fopenmp-simd %s 4 5 extern int omp_default_mem_alloc; 6 void foo() { 7 } 8 9 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} expected-note 1 {{forward declaration of 'S1'}} expected-note {{forward declaration of 'S1'}} 10 extern S1 a; 11 class S2 { 12 mutable int a; 13 14 public: 15 S2() : a(0) {} 16 static float S2s; // expected-note {{static data member is predetermined as shared}} expected-note 1 {{static data member is predetermined as shared}} 17 }; 18 const S2 b; 19 const S2 ba[5]; 20 class S3 { 21 int a; 22 23 public: 24 S3() : a(0) {} 25 }; 26 const S3 c; // expected-note 2 {{'c' defined here}} 27 const S3 ca[5]; // expected-note 2 {{'ca' defined here}} 28 extern const int f; // expected-note 2 {{'f' declared here}} 29 30 int threadvar; 31 #pragma omp threadprivate(threadvar) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}} 32 33 class S4 { 34 int a; 35 S4(); // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}} 36 37 public: 38 S4(int v) : a(v) {} 39 }; 40 class S5 { 41 int a; 42 S5() : a(0) {} // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}} 43 44 public: 45 S5(int v) : a(v) {} 46 }; 47 namespace A { 48 double x; 49 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}} expected-note 2 {{defined as threadprivate or thread local}} 50 } 51 namespace B { 52 using A::x; 53 } 54 55 S3 h; 56 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} 57 58 template <class I, class C, class D, class E> 59 int foomain(I argc, C **argv) { 60 const I d = 5; // expected-note {{'d' defined here}} 61 const I da[5] = { 0 }; // expected-note {{'da' defined here}} 62 D e(4); 63 E g[] = {5, 6}; 64 I i; 65 I &j = i; 66 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}} 67 {} 68 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 69 {} 70 #pragma omp target parallel private() // expected-error {{expected expression}} 71 {} 72 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 73 {} 74 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 75 {} 76 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 77 {} 78 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}} 79 {} 80 #pragma omp target parallel private(argc) 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 '('}} 81 {} 82 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}} 83 {} 84 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 85 {} 86 #pragma omp target 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}} 87 {} 88 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}} 89 {} 90 #pragma omp target parallel private(ba) 91 {} 92 #pragma omp target parallel private(ca) // expected-error {{const-qualified variable without mutable fields cannot be private}} 93 {} 94 #pragma omp target parallel private(da) // expected-error {{const-qualified variable cannot be private}} 95 {} 96 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}} 97 {} 98 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 99 {} 100 #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 101 {} 102 #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} 103 foo(); 104 #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} 105 foo(); 106 #pragma omp target parallel private(i) 107 {} 108 #pragma omp target parallel private(j) 109 foo(); 110 #pragma omp parallel firstprivate(i) 111 for (int k = 0; k < 10; ++k) { 112 #pragma omp target parallel private(i) 113 foo(); 114 } 115 static int m; 116 #pragma omp target parallel private(m) // OK 117 foo(); 118 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}} 119 {} 120 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}} 121 #pragma omp parallel 122 { 123 int v = 0; 124 int i; 125 } 126 #pragma omp target parallel shared(i) 127 {} 128 #pragma omp target parallel private(i) 129 {} 130 #pragma omp target parallel private(j) 131 {} 132 #pragma omp target parallel private(i) 133 {} 134 static int si; 135 #pragma omp target parallel private(si) // OK 136 {} 137 return 0; 138 } 139 140 void bar(S4 a[2]) { 141 #pragma omp parallel 142 #pragma omp target parallel private(a) 143 {} 144 } 145 146 int main(int argc, char **argv) { 147 const int d = 5; // expected-note {{'d' defined here}} 148 const int da[5] = { 0 }; // expected-note {{'da' defined here}} 149 S4 e(4); 150 S5 g[] = {5, 6}; 151 int i; 152 int &j = i; 153 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}} 154 {} 155 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 156 {} 157 #pragma omp target parallel private() // expected-error {{expected expression}} 158 {} 159 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 160 {} 161 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 162 {} 163 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 164 {} 165 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}} 166 {} 167 #pragma omp target parallel private(argc) 168 {} 169 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}} 170 {} 171 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 172 {} 173 #pragma omp target 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}} 174 {} 175 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}} 176 {} 177 #pragma omp target parallel private(ba) 178 {} 179 #pragma omp target parallel private(ca) // expected-error {{const-qualified variable without mutable fields cannot be private}} 180 {} 181 #pragma omp target parallel private(da) // expected-error {{const-qualified variable cannot be private}} 182 {} 183 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}} 184 {} 185 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 186 {} 187 #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 188 {} 189 #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} 190 foo(); 191 #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} 192 foo(); 193 #pragma omp target parallel private(i) 194 {} 195 #pragma omp target parallel private(j) 196 foo(); 197 #pragma omp parallel firstprivate(i) 198 for (int k = 0; k < 10; ++k) { 199 #pragma omp target parallel private(i) 200 foo(); 201 } 202 static int m; 203 #pragma omp target parallel private(m) // OK 204 foo(); 205 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}} 206 {} 207 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}} 208 #pragma omp parallel 209 { 210 int i; 211 } 212 #pragma omp target parallel shared(i) 213 {} 214 #pragma omp target parallel private(i) 215 {} 216 #pragma omp target parallel private(j) 217 {} 218 #pragma omp target parallel private(i) 219 {} 220 static int si; 221 #pragma omp target parallel private(si) // OK 222 {} 223 return foomain<int, char, S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char, S4, S5>' requested here}} 224 } 225 226