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 // FIXME: Should argc really be a pointer? 170 #pragma omp distribute parallel for simd aligned (*argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 171 for (I k = 0; k < argc; ++k) ++k; 172 173 #pragma omp target 174 #pragma omp teams 175 #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}} 176 for (I k = 0; k < argc; ++k) ++k; 177 178 #pragma omp target 179 #pragma omp teams 180 #pragma omp distribute parallel for simd aligned (S1) // expected-error {{'S1' does not refer to a value}} 181 for (I k = 0; k < argc; ++k) ++k; 182 183 #pragma omp target 184 #pragma omp teams 185 #pragma omp distribute parallel for simd aligned (argv[1]) // expected-error {{expected variable name}} 186 for (I k = 0; k < argc; ++k) ++k; 187 188 #pragma omp target 189 #pragma omp teams 190 #pragma omp distribute parallel for simd aligned(e, g) 191 for (I k = 0; k < argc; ++k) ++k; 192 193 #pragma omp target 194 #pragma omp teams 195 #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'}} 196 for (I k = 0; k < argc; ++k) ++k; 197 198 #pragma omp target 199 #pragma omp teams 200 #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'}} 201 for (I k = 0; k < argc; ++k) ++k; 202 203 #pragma omp parallel 204 { 205 int *v = 0; 206 I i; 207 #pragma omp target 208 #pragma omp teams 209 #pragma omp distribute parallel for simd aligned(v:16) 210 for (I k = 0; k < argc; ++k) { i = k; v += 2; } 211 } 212 float *f; 213 214 #pragma omp target 215 #pragma omp teams 216 #pragma omp distribute parallel for simd aligned(f) 217 for (I k = 0; k < argc; ++k) ++k; 218 219 int v = 0; 220 221 #pragma omp target 222 #pragma omp teams 223 #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}} 224 225 for (I k = 0; k < argc; ++k) { ++k; v += j; } 226 227 #pragma omp target 228 #pragma omp teams 229 #pragma omp distribute parallel for simd aligned(f) 230 for (I k = 0; k < argc; ++k) ++k; 231 232 return 0; 233 } 234 235 // expected-note@+1 2 {{'argc' defined here}} 236 int main(int argc, char **argv) { 237 double darr[100]; 238 // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}} 239 test_template<-4>(darr, 4); 240 test_warn<4>(); // ok 241 // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}} 242 test_warn<0>(); 243 244 int i; 245 int &j = i; 246 247 #pragma omp target 248 #pragma omp teams 249 #pragma omp distribute parallel for simd aligned // expected-error {{expected '(' after 'aligned'}} 250 for (int k = 0; k < argc; ++k) ++k; 251 252 #pragma omp target 253 #pragma omp teams 254 #pragma omp distribute parallel for simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 255 for (int k = 0; k < argc; ++k) ++k; 256 257 #pragma omp target 258 #pragma omp teams 259 #pragma omp distribute parallel for simd aligned () // expected-error {{expected expression}} 260 for (int k = 0; k < argc; ++k) ++k; 261 262 #pragma omp target 263 #pragma omp teams 264 #pragma omp distribute parallel for simd aligned (argv // expected-error {{expected ')'}} expected-note {{to match this '('}} 265 for (int k = 0; k < argc; ++k) ++k; 266 267 #pragma omp target 268 #pragma omp teams 269 #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'}} 270 for (int k = 0; k < argc; ++k) ++k; 271 272 #pragma omp target 273 #pragma omp teams 274 #pragma omp distribute parallel for simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 275 for (int k = 0; k < argc; ++k) ++k; 276 277 #pragma omp target 278 #pragma omp teams 279 #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'}} 280 for (int k = 0; k < argc; ++k) ++k; 281 282 #pragma omp target 283 #pragma omp teams 284 #pragma omp distribute parallel for simd aligned (S1) // expected-error {{'S1' does not refer to a value}} 285 for (int k = 0; k < argc; ++k) ++k; 286 287 #pragma omp target 288 #pragma omp teams 289 #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'}} 290 for (int k = 0; k < argc; ++k) ++k; 291 292 #pragma omp target 293 #pragma omp teams 294 #pragma omp distribute parallel for simd aligned (argv[1]) // expected-error {{expected variable name}} 295 for (int k = 0; k < argc; ++k) ++k; 296 297 #pragma omp target 298 #pragma omp teams 299 #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'}} 300 for (int k = 0; k < argc; ++k) ++k; 301 302 int *pargc = &argc; 303 // expected-note@+1 {{in instantiation of function template specialization 'foomain<int *, char>' requested here}} 304 foomain<int*,char>(pargc,argv); 305 return 0; 306 } 307 308