103 lines · c
1 2// RUN: %clang_cc1 %s -fopenacc -verify3 4typedef struct IsComplete {5 struct S { int A; } CompositeMember;6 int ScalarMember;7 float ArrayMember[5];8 void *PointerMember;9} Complete;10void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) {11 int LocalInt;12 short *LocalPointer;13 float LocalArray[5];14 Complete LocalComposite;15 // Check Appertainment:16#pragma acc parallel create(LocalInt)17 while(1);18#pragma acc serial create(LocalInt)19 while(1);20#pragma acc kernels create(LocalInt)21 while(1);22 23 // expected-warning@+1{{OpenACC clause name 'pcreate' is a deprecated clause name and is now an alias for 'create'}}24#pragma acc parallel pcreate(LocalInt)25 while(1);26 27 // expected-warning@+1{{OpenACC clause name 'present_or_create' is a deprecated clause name and is now an alias for 'create'}}28#pragma acc parallel present_or_create(LocalInt)29 while(1);30 31 // Valid cases:32#pragma acc parallel create(LocalInt, LocalPointer, LocalArray)33 while(1);34#pragma acc parallel create(LocalArray[2:1])35 while(1);36#pragma acc parallel create(zero:LocalArray[2:1])37 while(1);38 39#pragma acc parallel create(LocalComposite.ScalarMember, LocalComposite.ScalarMember)40 while(1);41 42 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}43#pragma acc parallel create(1 + IntParam)44 while(1);45 46 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}47#pragma acc parallel create(+IntParam)48 while(1);49 50 // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}51#pragma acc parallel create(PointerParam[2:])52 while(1);53 54 // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}55#pragma acc parallel create(ArrayParam[2:5])56 while(1);57 58 // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}59 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}60#pragma acc parallel create((float*)ArrayParam[2:5])61 while(1);62 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}63#pragma acc parallel create((float)ArrayParam[2])64 while(1);65 // expected-error@+2{{unknown modifier 'invalid' in OpenACC modifier-list on 'create' clause}}66 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}67#pragma acc parallel create(invalid:(float)ArrayParam[2])68 while(1);69 70 // expected-error@+1{{OpenACC 'create' clause is not valid on 'loop' directive}}71#pragma acc loop create(LocalInt)72 for(int i = 5; i < 10;++i);73 // expected-error@+1{{OpenACC 'pcreate' clause is not valid on 'loop' directive}}74#pragma acc loop pcreate(LocalInt)75 for(int i = 5; i < 10;++i);76 // expected-error@+1{{OpenACC 'present_or_create' clause is not valid on 'loop' directive}}77#pragma acc loop present_or_create(LocalInt)78 for(int i = 5; i < 10;++i);79}80void ModList() {81 int V1;82 // expected-error@+4{{OpenACC 'always' modifier not valid on 'create' clause}}83 // expected-error@+3{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}84 // expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}85 // expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}86#pragma acc parallel create(always, alwaysin, alwaysout, zero, readonly: V1)87 for(int i = 5; i < 10;++i);88 // expected-error@+1{{OpenACC 'always' modifier not valid on 'create' clause}}89#pragma acc serial create(always: V1)90 for(int i = 5; i < 10;++i);91 // expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}92#pragma acc kernels create(alwaysin: V1)93 for(int i = 5; i < 10;++i);94 // expected-error@+1{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}95#pragma acc parallel create(alwaysout: V1)96 for(int i = 5; i < 10;++i);97 // expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}98#pragma acc serial create(readonly: V1)99 for(int i = 5; i < 10;++i);100#pragma acc parallel create(capture:V1)101 for(int i = 5; i < 10;++i);102}103