// RUN: %clang_cc1 %s -verify -fopenacc struct S { int foo; char Array[1]; }; char *getArrayPtr(); void func() { char Array[10]; char *ArrayPtr = getArrayPtr(); int *readonly; struct S s; for (int i = 0; i < 10; ++i) { // expected-error@+1{{expected '('}} #pragma acc cache } for (int i = 0; i < 10; ++i) { // expected-error@+2{{expected '('}} // expected-error@+1{{invalid OpenACC clause 'clause'}} #pragma acc cache clause list } for (int i = 0; i < 10; ++i) { // expected-error@+1{{expected expression}} #pragma acc cache() } for (int i = 0; i < 10; ++i) { // expected-error@+2{{expected expression}} // expected-error@+1{{invalid OpenACC clause 'clause'}} #pragma acc cache() clause-list } for (int i = 0; i < 10; ++i) { // expected-error@+2{{expected ')'}} // expected-note@+1{{to match this '('}} #pragma acc cache( } for (int i = 0; i < 10; ++i) { // expected-error@+3{{use of undeclared identifier 'invalid'}} // expected-error@+2{{expected ')'}} // expected-note@+1{{to match this '('}} #pragma acc cache(invalid } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+3{{expected ')'}} // expected-note@+2{{to match this '('}} // expected-error@+1{{OpenACC variable in 'cache' directive is not a valid sub-array or array element}} #pragma acc cache(ArrayPtr } for (int i = 0; i < 10; ++i) { // expected-error@+1{{use of undeclared identifier 'invalid'}} #pragma acc cache(invalid) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+1{{OpenACC variable in 'cache' directive is not a valid sub-array or array element}} #pragma acc cache(ArrayPtr) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+5{{expected expression}} // expected-error@+4{{expected ']'}} // expected-note@+3{{to match this '['}} // expected-error@+2{{expected ')'}} // expected-note@+1{{to match this '('}} #pragma acc cache(ArrayPtr[ } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+3{{expected expression}} // expected-error@+2{{expected ']'}} // expected-note@+1{{to match this '['}} #pragma acc cache(ArrayPtr[, 5) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+3{{expected expression}} // expected-error@+2{{expected ']'}} // expected-note@+1{{to match this '['}} #pragma acc cache(Array[) } #pragma acc loop for (int i = 0; i < 10; ++i) { #pragma acc cache(Array[*readonly]) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+5{{expected expression}} // expected-error@+4{{expected ']'}} // expected-note@+3{{to match this '['}} // expected-error@+2{{expected ')'}} // expected-note@+1{{to match this '('}} #pragma acc cache(Array[*readonly: } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+1{{OpenACC variable in 'cache' directive is not a valid sub-array or array element}} #pragma acc cache(readonly) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+2{{invalid tag 'devnum' on 'cache' directive}} // expected-error@+1{{OpenACC variable in 'cache' directive is not a valid sub-array or array element}} #pragma acc cache(devnum:ArrayPtr) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+2{{invalid tag 'invalid' on 'cache' directive}} // expected-error@+1{{OpenACC variable in 'cache' directive is not a valid sub-array or array element}} #pragma acc cache(invalid:ArrayPtr) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+1{{OpenACC variable in 'cache' directive is not a valid sub-array or array element}} #pragma acc cache(readonly:ArrayPtr) } #pragma acc loop for (int i = 0; i < 10; ++i) { #pragma acc cache(readonly:ArrayPtr[5:1]) } #pragma acc loop for (int i = 0; i < 10; ++i) { #pragma acc cache(readonly:ArrayPtr[5:*readonly]) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+1{{OpenACC variable in 'cache' directive is not a valid sub-array or array element}} #pragma acc cache(readonly:ArrayPtr[5:*readonly], Array) } #pragma acc loop for (int i = 0; i < 10; ++i) { #pragma acc cache(readonly:ArrayPtr[5:*readonly], Array[*readonly:3]) } #pragma acc loop for (int i = 0; i < 10; ++i) { #pragma acc cache(readonly:ArrayPtr[5 + 0:*readonly], Array[*readonly + 0:3]) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+3{{expected expression}} // expected-error@+2{{expected ')'}} // expected-note@+1{{to match this '('}} #pragma acc cache(readonly:ArrayPtr[5:*readonly], } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+1{{expected expression}} #pragma acc cache(readonly:ArrayPtr[5:*readonly],) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-warning@+1{{left operand of comma operator has no effect}} #pragma acc cache(readonly:ArrayPtr[5,6:*readonly]) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-warning@+1{{left operand of comma operator has no effect}} #pragma acc cache(readonly:ArrayPtr[5:3, *readonly], ArrayPtr[0]) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-error@+1{{OpenACC variable in 'cache' directive is not a valid sub-array or array element}} #pragma acc cache(readonly:s.foo) } #pragma acc loop for (int i = 0; i < 10; ++i) { // expected-warning@+1{{left operand of comma operator has no effect}} #pragma acc cache(readonly:s.Array[1,2]) } }