1 // RUN: %clang_cc1 -x c++ -std=c++11 -verify -fopenmp %s 2 3 struct B { 4 static int ib[20]; // expected-note 0 {{'B::ib' declared here}} 5 static constexpr int bfoo() { return 8; } 6 }; 7 namespace X { 8 B x; // expected-note {{'x' defined here}} 9 }; 10 constexpr int bfoo() { return 4; } 11 12 int **z; 13 const int C1 = 1; 14 const int C2 = 2; 15 void test_aligned_colons(int *&rp) 16 { 17 int *B = 0; 18 19 #pragma omp target 20 #pragma omp teams 21 #pragma omp distribute parallel for simd aligned(B:bfoo()) 22 for (int i = 0; i < 10; ++i) ; 23 24 #pragma omp target 25 #pragma omp teams 26 #pragma omp distribute parallel for simd aligned(B::ib:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'}} 27 for (int i = 0; i < 10; ++i) ; 28 29 #pragma omp target 30 #pragma omp teams 31 #pragma omp distribute parallel for simd aligned(B:B::bfoo()) 32 for (int i = 0; i < 10; ++i) ; 33 34 #pragma omp target 35 #pragma omp teams 36 #pragma omp distribute parallel for simd aligned(z:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}} 37 for (int i = 0; i < 10; ++i) ; 38 39 #pragma omp target 40 #pragma omp teams 41 #pragma omp distribute parallel for simd aligned(B:B::bfoo()) 42 for (int i = 0; i < 10; ++i) ; 43 44 #pragma omp target 45 #pragma omp teams 46 #pragma omp distribute parallel for simd aligned(X::x : ::z) // expected-error {{integral constant expression must have integral or unscoped enumeration type, not 'int **'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'B'}} 47 for (int i = 0; i < 10; ++i) ; 48 49 #pragma omp target 50 #pragma omp teams 51 #pragma omp distribute parallel for simd aligned(B,rp,::z: X::x) // expected-error {{integral constant expression must have integral or unscoped enumeration type, not 'B'}} 52 for (int i = 0; i < 10; ++i) ; 53 54 #pragma omp target 55 #pragma omp teams 56 #pragma omp distribute parallel for simd aligned(::z) 57 for (int i = 0; i < 10; ++i) ; 58 59 #pragma omp distribute parallel for simd aligned(B::bfoo()) // expected-error {{expected variable name}} 60 for (int i = 0; i < 10; ++i) ; 61 62 #pragma omp target 63 #pragma omp teams 64 #pragma omp distribute parallel for simd aligned(B::ib,B:C1+C2) // expected-warning {{aligned clause will be ignored because the requested alignment is not a power of 2}} 65 for (int i = 0; i < 10; ++i) ; 66 } 67 68 // expected-note@+1 {{'num' defined here}} 69 template<int L, class T, class N> T test_template(T* arr, N num) { 70 N i; 71 T sum = (T)0; 72 T ind2 = - num * L; 73 // Negative number is passed as L. 74 75 #pragma omp target 76 #pragma omp teams 77 #pragma omp distribute parallel for simd aligned(arr:L) // expected-error {{argument to 'aligned' clause must be a strictly positive integer value}} 78 for (i = 0; i < num; ++i) { 79 T cur = arr[(int)ind2]; 80 ind2 += L; 81 sum += cur; 82 } 83 84 #pragma omp target 85 #pragma omp teams 86 #pragma omp distribute parallel for simd aligned(num:4) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} 87 for (i = 0; i < num; ++i); 88 89 return T(); 90 } 91 92 template<int LEN> int test_warn() { 93 int *ind2 = 0; 94 #pragma omp target 95 #pragma omp teams 96 #pragma omp distribute parallel for simd aligned(ind2:LEN) // expected-error {{argument to 'aligned' clause must be a strictly positive integer value}} 97 for (int i = 0; i < 100; i++) { 98 ind2 += LEN; 99 } 100 return 0; 101 } 102 103 struct S1; // expected-note 2 {{declared here}} 104 extern S1 a; // expected-note {{'a' declared here}} 105 class S2 { 106 mutable int a; 107 public: 108 S2():a(0) { } 109 }; 110 const S2 b; // expected-note 1 {{'b' defined here}} 111 const S2 ba[5]; 112 class S3 { 113 int a; 114 public: 115 S3():a(0) { } 116 }; 117 const S3 ca[5]; 118 class S4 { 119 int a; 120 S4(); 121 public: 122 S4(int v):a(v) { } 123 }; 124 class S5 { 125 int a; 126 S5():a(0) {} 127 public: 128 S5(int v):a(v) { } 129 }; 130 131 S3 h; // expected-note 2 {{'h' defined here}} 132 #pragma omp threadprivate(h) 133 134 template<class I, class C> int foomain(I argc, C **argv) { 135 I e(argc); 136 I g(argc); 137 int i; // expected-note {{declared here}} expected-note {{'i' defined here}} 138 // expected-note@+2 {{declared here}} 139 // expected-note@+1 {{reference to 'i' is not a constant expression}} 140 int &j = i; 141 142 #pragma omp target 143 #pragma omp teams 144 #pragma omp distribute parallel for simd aligned // expected-error {{expected '(' after 'aligned'}} 145 for (I k = 0; k < argc; ++k) ++k; 146 147 #pragma omp target 148 #pragma omp teams 149 #pragma omp distribute parallel for simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 150 for (I k = 0; k < argc; ++k) ++k; 151 152 #pragma omp target 153 #pragma omp teams 154 #pragma omp distribute parallel for simd aligned () // expected-error {{expected expression}} 155 for (I k = 0; k < argc; ++k) ++k; 156 157 #pragma omp target 158 #pragma omp teams 159 #pragma omp distribute parallel for simd aligned (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 160 for (I k = 0; k < argc; ++k) ++k; 161 162 #pragma omp target 163 #pragma omp teams 164 #pragma omp distribute parallel for simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 165 for (I k = 0; k < argc; ++k) ++k; 166 167 #pragma omp target 168 #pragma omp teams 169 #pragma omp distribute parallel for simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 170 for (I k = 0; k < argc; ++k) ++k; 171 172 #pragma omp target 173 #pragma omp teams 174 #pragma omp distribute parallel for simd aligned (argc : 5) // expected-warning {{aligned clause will be ignored because the requested alignment is not a power of 2}} 175 for (I k = 0; k < argc; ++k) ++k; 176 177 #pragma omp target 178 #pragma omp teams 179 #pragma omp distribute parallel for simd aligned (S1) // expected-error {{'S1' does not refer to a value}} 180 for (I k = 0; k < argc; ++k) ++k; 181 182 #pragma omp target 183 #pragma omp teams 184 #pragma omp distribute parallel for simd aligned (argv[1]) // expected-error {{expected variable name}} 185 for (I k = 0; k < argc; ++k) ++k; 186 187 #pragma omp target 188 #pragma omp teams 189 #pragma omp distribute parallel for simd aligned(e, g) 190 for (I k = 0; k < argc; ++k) ++k; 191 192 #pragma omp target 193 #pragma omp teams 194 #pragma omp distribute parallel for simd aligned(h) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}} 195 for (I k = 0; k < argc; ++k) ++k; 196 197 #pragma omp target 198 #pragma omp teams 199 #pragma omp distribute parallel for simd aligned(i) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} 200 for (I k = 0; k < argc; ++k) ++k; 201 202 #pragma omp parallel 203 { 204 int *v = 0; 205 I i; 206 #pragma omp target 207 #pragma omp teams 208 #pragma omp distribute parallel for simd aligned(v:16) 209 for (I k = 0; k < argc; ++k) { i = k; v += 2; } 210 } 211 float *f; 212 213 #pragma omp target 214 #pragma omp teams 215 #pragma omp distribute parallel for simd aligned(f) 216 for (I k = 0; k < argc; ++k) ++k; 217 218 int v = 0; 219 220 #pragma omp target 221 #pragma omp teams 222 #pragma omp distribute parallel for simd aligned(f:j) // expected-note {{initializer of 'j' is not a constant expression}} expected-error {{expression is not an integral constant expression}} 223 224 for (I k = 0; k < argc; ++k) { ++k; v += j; } 225 226 #pragma omp target 227 #pragma omp teams 228 #pragma omp distribute parallel for simd aligned(f) 229 for (I k = 0; k < argc; ++k) ++k; 230 231 return 0; 232 } 233 234 // expected-note@+1 2 {{'argc' defined here}} 235 int main(int argc, char **argv) { 236 double darr[100]; 237 // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}} 238 test_template<-4>(darr, 4); 239 test_warn<4>(); // ok 240 // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}} 241 test_warn<0>(); 242 243 int i; 244 int &j = i; 245 246 #pragma omp target 247 #pragma omp teams 248 #pragma omp distribute parallel for simd aligned // expected-error {{expected '(' after 'aligned'}} 249 for (int k = 0; k < argc; ++k) ++k; 250 251 #pragma omp target 252 #pragma omp teams 253 #pragma omp distribute parallel for simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 254 for (int k = 0; k < argc; ++k) ++k; 255 256 #pragma omp target 257 #pragma omp teams 258 #pragma omp distribute parallel for simd aligned () // expected-error {{expected expression}} 259 for (int k = 0; k < argc; ++k) ++k; 260 261 #pragma omp target 262 #pragma omp teams 263 #pragma omp distribute parallel for simd aligned (argv // expected-error {{expected ')'}} expected-note {{to match this '('}} 264 for (int k = 0; k < argc; ++k) ++k; 265 266 #pragma omp target 267 #pragma omp teams 268 #pragma omp distribute parallel for simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} 269 for (int k = 0; k < argc; ++k) ++k; 270 271 #pragma omp target 272 #pragma omp teams 273 #pragma omp distribute parallel for simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 274 for (int k = 0; k < argc; ++k) ++k; 275 276 #pragma omp target 277 #pragma omp teams 278 #pragma omp distribute parallel for simd aligned (argc) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} 279 for (int k = 0; k < argc; ++k) ++k; 280 281 #pragma omp target 282 #pragma omp teams 283 #pragma omp distribute parallel for simd aligned (S1) // expected-error {{'S1' does not refer to a value}} 284 for (int k = 0; k < argc; ++k) ++k; 285 286 #pragma omp target 287 #pragma omp teams 288 #pragma omp distribute parallel for simd aligned (a, b) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}} 289 for (int k = 0; k < argc; ++k) ++k; 290 291 #pragma omp target 292 #pragma omp teams 293 #pragma omp distribute parallel for simd aligned (argv[1]) // expected-error {{expected variable name}} 294 for (int k = 0; k < argc; ++k) ++k; 295 296 #pragma omp target 297 #pragma omp teams 298 #pragma omp distribute parallel for simd aligned(h) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}} 299 for (int k = 0; k < argc; ++k) ++k; 300 301 int *pargc = &argc; 302 // expected-note@+1 {{in instantiation of function template specialization 'foomain<int *, char>' requested here}} 303 foomain<int*,char>(pargc,argv); 304 return 0; 305 } 306 307