1*b0de656bSDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 %s -verify 2*b0de656bSDavid Pagan foobar()3*b0de656bSDavid Paganint foobar() { 4*b0de656bSDavid Pagan return 1; 5*b0de656bSDavid Pagan } 6*b0de656bSDavid Pagan main(int argc,char * argv[])7*b0de656bSDavid Paganint main(int argc, char *argv[]) { 8*b0de656bSDavid Pagan // expected-note@+1 {{declared here}} 9*b0de656bSDavid Pagan int a; 10*b0de656bSDavid Pagan // expected-note@+1 {{declared here}} 11*b0de656bSDavid Pagan int b; 12*b0de656bSDavid Pagan // expected-note@+1 {{declared here}} 13*b0de656bSDavid Pagan int c; 14*b0de656bSDavid Pagan double f; 15*b0de656bSDavid Pagan int foo2[10]; 16*b0de656bSDavid Pagan 17*b0de656bSDavid Pagan // expected-error@+1 {{expected '(' after 'align'}} 18*b0de656bSDavid Pagan #pragma omp allocate(a) align 19*b0de656bSDavid Pagan // expected-error@+3 {{expected expression}} 20*b0de656bSDavid Pagan // expected-error@+2 {{expected ')'}} 21*b0de656bSDavid Pagan // expected-note@+1 {{to match this '('}} 22*b0de656bSDavid Pagan #pragma omp allocate(a) align( 23*b0de656bSDavid Pagan // expected-error@+1 {{expected expression}} 24*b0de656bSDavid Pagan #pragma omp allocate(a) align() 25*b0de656bSDavid Pagan // expected-error@+4 {{expected ')'}} 26*b0de656bSDavid Pagan // expected-note@+3 {{to match this '('}} 27*b0de656bSDavid Pagan // expected-error@+2 {{expression is not an integral constant expression}} 28*b0de656bSDavid Pagan // expected-note@+1 {{read of non-const variable 'a' is not allowed in a constant expression}} 29*b0de656bSDavid Pagan #pragma omp allocate(a) align(a 30*b0de656bSDavid Pagan // expected-error@+2 {{expression is not an integral constant expression}} 31*b0de656bSDavid Pagan // expected-note@+1 {{read of non-const variable 'b' is not allowed in a constant expression}} 32*b0de656bSDavid Pagan #pragma omp allocate(a) align(b) 33*b0de656bSDavid Pagan // expected-error@+2 {{expression is not an integral constant expression}} 34*b0de656bSDavid Pagan // expected-note@+1 {{read of non-const variable 'c' is not allowed in a constant expression}} 35*b0de656bSDavid Pagan #pragma omp allocate(a) align(c + 1) 36*b0de656bSDavid Pagan // expected-error@+1 {{expected an OpenMP directive}} 37*b0de656bSDavid Pagan #pragma omp align(2) allocate(a) 38*b0de656bSDavid Pagan // expected-error@+1 {{directive '#pragma omp allocate' cannot contain more than one 'align' clause}} 39*b0de656bSDavid Pagan #pragma omp allocate(a) align(2) align(4) 40*b0de656bSDavid Pagan // expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}} 41*b0de656bSDavid Pagan #pragma omp allocate(a) align(9) 42*b0de656bSDavid Pagan // expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'double'}} 43*b0de656bSDavid Pagan #pragma omp allocate(a) align(f) 44*b0de656bSDavid Pagan } 45*b0de656bSDavid Pagan 46*b0de656bSDavid Pagan // Verify appropriate errors when using templates. 47*b0de656bSDavid Pagan template <typename T, unsigned size, unsigned align> run()48*b0de656bSDavid PaganT run() { 49*b0de656bSDavid Pagan T foo[size]; 50*b0de656bSDavid Pagan // expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}} 51*b0de656bSDavid Pagan #pragma omp allocate(foo) align(align) 52*b0de656bSDavid Pagan return foo[0]; 53*b0de656bSDavid Pagan } 54*b0de656bSDavid Pagan template_test()55*b0de656bSDavid Paganint template_test() { 56*b0de656bSDavid Pagan double d; 57*b0de656bSDavid Pagan // expected-note@+1 {{in instantiation of function template specialization 'run<double, 10U, 3U>' requested here}} 58*b0de656bSDavid Pagan d = run<double, 10, 3>(); 59*b0de656bSDavid Pagan return 0; 60*b0de656bSDavid Pagan } 61