xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-if-clause.c (revision bfc2dbe02e00f0023c0a2d58b53cdbd1f4139f02)
1 // RUN: %clang_cc1 %s -fopenacc -verify
2 
3 void BoolExpr(int *I, float *F) {
4 
5   typedef struct {} SomeStruct;
6   int Array[5];
7 
8   struct C{};
9   // expected-error@+1{{expected expression}}
10 #pragma acc parallel if (struct C f())
11   while(0);
12 
13   // expected-error@+1{{unexpected type name 'SomeStruct': expected expression}}
14 #pragma acc serial if (SomeStruct)
15   while(0);
16 
17   // expected-error@+1{{unexpected type name 'SomeStruct': expected expression}}
18 #pragma acc serial if (SomeStruct())
19   while(0);
20 
21   SomeStruct S;
22   // expected-error@+1{{statement requires expression of scalar type ('SomeStruct' invalid)}}
23 #pragma acc serial if (S)
24   while(0);
25 
26   // expected-warning@+1{{address of array 'Array' will always evaluate to 'true'}}
27 #pragma acc kernels if (Array)
28   while(0);
29 
30   // expected-warning@+4{{incompatible pointer types assigning to 'int *' from 'float *'}}
31   // expected-warning@+3{{using the result of an assignment as a condition without parentheses}}
32   // expected-note@+2{{place parentheses around the assignment to silence this warning}}
33   // expected-note@+1{{use '==' to turn this assignment into an equality comparison}}
34 #pragma acc kernels if (I = F)
35   while(0);
36 
37 #pragma acc parallel if (I)
38   while(0);
39 
40 #pragma acc serial if (F)
41   while(0);
42 
43 #pragma acc kernels if (*I < *F)
44   while(0);
45 
46   // expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
47 #pragma acc data if (*I < *F)
48   while(0);
49 #pragma acc parallel loop if (*I < *F)
50   for(int i = 0; i < 5; ++i);
51 #pragma acc serial loop if (*I < *F)
52   for(int i = 0; i < 5; ++i);
53 #pragma acc kernels loop if (*I < *F)
54   for(int i = 0; i < 5; ++i);
55 
56   // expected-error@+1{{OpenACC 'if' clause is not valid on 'loop' directive}}
57 #pragma acc loop if(I)
58   for(int i = 5; i < 10;++i);
59 }
60