1bd909d2eSerichkeane // RUN: %clang_cc1 %s -fopenacc -verify 2bd909d2eSerichkeane 3bd909d2eSerichkeane typedef struct IsComplete { 4bd909d2eSerichkeane struct S { int A; } CompositeMember; 5bd909d2eSerichkeane int ScalarMember; 6bd909d2eSerichkeane float ArrayMember[5]; 7bd909d2eSerichkeane void *PointerMember; 8bd909d2eSerichkeane } Complete; 9bd909d2eSerichkeane void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) { 10bd909d2eSerichkeane int LocalInt; 11bd909d2eSerichkeane short *LocalPointer; 12bd909d2eSerichkeane float LocalArray[5]; 13bd909d2eSerichkeane Complete LocalComposite; 14bd909d2eSerichkeane // Check Appertainment: 15bd909d2eSerichkeane #pragma acc parallel no_create(LocalInt) 16bd909d2eSerichkeane while(1); 17bd909d2eSerichkeane #pragma acc serial no_create(LocalInt) 18bd909d2eSerichkeane while(1); 19bd909d2eSerichkeane #pragma acc kernels no_create(LocalInt) 20bd909d2eSerichkeane while(1); 21bd909d2eSerichkeane 22bd909d2eSerichkeane // Valid cases: 23bd909d2eSerichkeane #pragma acc parallel no_create(LocalInt, LocalPointer, LocalArray) 24bd909d2eSerichkeane while(1); 25bd909d2eSerichkeane #pragma acc parallel no_create(LocalArray[2:1]) 26bd909d2eSerichkeane while(1); 27bd909d2eSerichkeane 28bd909d2eSerichkeane #pragma acc parallel no_create(LocalComposite.ScalarMember, LocalComposite.ScalarMember) 29bd909d2eSerichkeane while(1); 30bd909d2eSerichkeane 31a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} 32bd909d2eSerichkeane #pragma acc parallel no_create(1 + IntParam) 33bd909d2eSerichkeane while(1); 34bd909d2eSerichkeane 35a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} 36bd909d2eSerichkeane #pragma acc parallel no_create(+IntParam) 37bd909d2eSerichkeane while(1); 38bd909d2eSerichkeane 39bd909d2eSerichkeane // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} 40bd909d2eSerichkeane #pragma acc parallel no_create(PointerParam[2:]) 41bd909d2eSerichkeane while(1); 42bd909d2eSerichkeane 43bd909d2eSerichkeane // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} 44bd909d2eSerichkeane #pragma acc parallel no_create(ArrayParam[2:5]) 45bd909d2eSerichkeane while(1); 46bd909d2eSerichkeane 47bd909d2eSerichkeane // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} 48a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} 49bd909d2eSerichkeane #pragma acc parallel no_create((float*)ArrayParam[2:5]) 50bd909d2eSerichkeane while(1); 51a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} 52bd909d2eSerichkeane #pragma acc parallel no_create((float)ArrayParam[2]) 53bd909d2eSerichkeane while(1); 546119340eSerichkeane 5542f4e505SErich Keane // expected-error@+1{{OpenACC 'no_create' clause is not valid on 'loop' directive}} 566119340eSerichkeane #pragma acc loop no_create(LocalInt) 57*b0cfbfd7SErich Keane for(int i = 5; i < 10;++i); 58bd909d2eSerichkeane } 59