xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-create-clause.c (revision b0cfbfd74bfd9d077f7c1854a1b38dcbe9d402e4)
1 
2 // RUN: %clang_cc1 %s -fopenacc -verify
3 
4 typedef struct IsComplete {
5   struct S { int A; } CompositeMember;
6   int ScalarMember;
7   float ArrayMember[5];
8   void *PointerMember;
9 } Complete;
10 void 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{{invalid tag 'invalid' 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 }
80