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