1ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -x c++ -std=c++11 -verify -fopenmp=libiomp5 %s 2ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 3ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct B { 4ef8225444452a1486bd721f3285301fe84643b00Stephen Hines static int ib[20]; // expected-note 0 {{'B::ib' declared here}} 5ef8225444452a1486bd721f3285301fe84643b00Stephen Hines static constexpr int bfoo() { return 8; } 6ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 7ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace X { 8ef8225444452a1486bd721f3285301fe84643b00Stephen Hines B x; // expected-note {{'x' defined here}} 9ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 10ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconstexpr int bfoo() { return 4; } 11ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 12ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint **z; 13ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst int C1 = 1; 14ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst int C2 = 2; 15ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid test_aligned_colons(int *&rp) 16ef8225444452a1486bd721f3285301fe84643b00Stephen Hines{ 17ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int *B = 0; 18ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(B:bfoo()) 19ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 20ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'}} 21ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(B::ib:B:bfoo()) 22ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 23ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(B:B::bfoo()) 24ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 25ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'?}} 26ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(z:B:bfoo()) 27ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 28ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(B:B::bfoo()) 29ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 30ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'int **'}} 31ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'B'}} 32ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(X::x : ::z) 33ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'B'}} 35ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(B,rp,::z: X::x) 36ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 37ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(::z) 38ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 39ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{expected variable name}} 40ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(B::bfoo()) 41ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 42ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(B::ib,B:C1+C2) 43ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 10; ++i) ; 44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 45ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 46ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+1 {{'num' defined here}} 47ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate<int L, class T, class N> T test_template(T* arr, N num) { 48ef8225444452a1486bd721f3285301fe84643b00Stephen Hines N i; 49ef8225444452a1486bd721f3285301fe84643b00Stephen Hines T sum = (T)0; 50ef8225444452a1486bd721f3285301fe84643b00Stephen Hines T ind2 = - num * L; 51ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Negative number is passed as L. 52ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument to 'aligned' clause must be a positive integer value}} 53ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(arr:L) 54ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (i = 0; i < num; ++i) { 55ef8225444452a1486bd721f3285301fe84643b00Stephen Hines T cur = arr[(int)ind2]; 56ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ind2 += L; 57ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sum += cur; 58ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 59ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} 60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(num:4) 61ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (i = 0; i < num; ++i); 62ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return T(); 63ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 64ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 65ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate<int LEN> int test_warn() { 66ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int *ind2 = 0; 67ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument to 'aligned' clause must be a positive integer value}} 68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(ind2:LEN) 69ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int i = 0; i < 100; i++) { 70ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ind2 += LEN; 71ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 72ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return 0; 73ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 74ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 75ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct S1; // expected-note 2 {{declared here}} 76ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesextern S1 a; // expected-note {{'a' declared here}} 77ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S2 { 78ef8225444452a1486bd721f3285301fe84643b00Stephen Hines mutable int a; 79ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 80ef8225444452a1486bd721f3285301fe84643b00Stephen Hines S2():a(0) { } 81ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 82ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S2 b; // expected-note 1 {{'b' defined here}} 83ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S2 ba[5]; 84ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S3 { 85ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int a; 86ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 87ef8225444452a1486bd721f3285301fe84643b00Stephen Hines S3():a(0) { } 88ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 89ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S3 ca[5]; 90ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S4 { 91ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int a; 92ef8225444452a1486bd721f3285301fe84643b00Stephen Hines S4(); 93ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 94ef8225444452a1486bd721f3285301fe84643b00Stephen Hines S4(int v):a(v) { } 95ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 96ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S5 { 97ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int a; 98ef8225444452a1486bd721f3285301fe84643b00Stephen Hines S5():a(0) {} 99ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines S5(int v):a(v) { } 101ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 102ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 103ef8225444452a1486bd721f3285301fe84643b00Stephen HinesS3 h; // expected-note 2 {{'h' defined here}} 104ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp threadprivate(h) 105ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 106ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate<class I, class C> int foomain(I argc, C **argv) { 107ef8225444452a1486bd721f3285301fe84643b00Stephen Hines I e(argc); 108ef8225444452a1486bd721f3285301fe84643b00Stephen Hines I g(argc); 109ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int i; // expected-note {{declared here}} expected-note {{'i' defined here}} 110ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-note@+2 {{declared here}} 111ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-note@+1 {{reference to 'i' is not a constant expression}} 112ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int &j = i; 113ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned // expected-error {{expected '(' after 'aligned'}} 114ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 115ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 116ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 117ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned () // expected-error {{expected expression}} 118ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 119ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 120ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 121ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 122ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 123ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 124ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 125ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argc : 5) 126ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 127ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (S1) // expected-error {{'S1' does not refer to a value}} 128ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 129ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argv[1]) // expected-error {{expected variable name}} 130ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 131ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(e, g) 132ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 133ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}} 134ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(h) 135ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 136ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} 137ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(i) 138ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 139ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp parallel 140ef8225444452a1486bd721f3285301fe84643b00Stephen Hines { 141ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int *v = 0; 142ef8225444452a1486bd721f3285301fe84643b00Stephen Hines I i; 143ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(v:16) 144ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) { i = k; v += 2; } 145ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 146ef8225444452a1486bd721f3285301fe84643b00Stephen Hines float *f; 147ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(f) 148ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 149ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int v = 0; 150ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-note@+2 {{initializer of 'j' is not a constant expression}} 151ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{expression is not an integral constant expression}} 152ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(f:j) 153ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) { ++k; v += j; } 154ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(f) 155ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (I k = 0; k < argc; ++k) ++k; 156ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return 0; 157ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 158ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 159ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+1 2 {{'argc' defined here}} 160ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint main(int argc, char **argv) { 161ef8225444452a1486bd721f3285301fe84643b00Stephen Hines double darr[100]; 162ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}} 163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines test_template<-4>(darr, 4); 164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines test_warn<4>(); // ok 165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}} 166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines test_warn<0>(); 167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int i; 169ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int &j = i; 170ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned // expected-error {{expected '(' after 'aligned'}} 171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned () // expected-error {{expected expression}} 175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argv // expected-error {{expected ')'}} expected-note {{to match this '('}} 177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} 179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} 184ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argc) 185ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 186ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (S1) // expected-error {{'S1' does not refer to a value}} 187ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 188ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+2 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}} 189ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}} 190ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (a, b) 191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 192ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned (argv[1]) // expected-error {{expected variable name}} 193ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 194ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}} 195ef8225444452a1486bd721f3285301fe84643b00Stephen Hines #pragma omp simd aligned(h) 196ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (int k = 0; k < argc; ++k) ++k; 197ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int *pargc = &argc; 198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines foomain<int*,char>(pargc,argv); 199ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return 0; 200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 202