xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-num_gangs-clause.cpp (revision 4bbdb018a6cb564783cfb9c65ca82b81c6006bb6)
1dc20a0eaSErich Keane // RUN: %clang_cc1 %s -fopenacc -verify
2dc20a0eaSErich Keane 
3dc20a0eaSErich Keane struct NotConvertible{} NC;
4dc20a0eaSErich Keane struct Incomplete *SomeIncomplete; // #INCOMPLETE
5dc20a0eaSErich Keane enum E{} SomeE;
6dc20a0eaSErich Keane enum class E2{} SomeE2;
7dc20a0eaSErich Keane 
8dc20a0eaSErich Keane struct CorrectConvert {
9dc20a0eaSErich Keane   operator int();
10dc20a0eaSErich Keane } Convert;
11dc20a0eaSErich Keane 
12dc20a0eaSErich Keane struct ExplicitConvertOnly {
13dc20a0eaSErich Keane   explicit operator int() const; // #EXPL_CONV
14dc20a0eaSErich Keane } Explicit;
15dc20a0eaSErich Keane 
16dc20a0eaSErich Keane struct AmbiguousConvert{
17dc20a0eaSErich Keane   operator int(); // #AMBIG_INT
18dc20a0eaSErich Keane   operator short(); // #AMBIG_SHORT
19dc20a0eaSErich Keane   operator float();
20dc20a0eaSErich Keane } Ambiguous;
21dc20a0eaSErich Keane 
22dc20a0eaSErich Keane short some_short();
23dc20a0eaSErich Keane int some_int();
24dc20a0eaSErich Keane long some_long();
25dc20a0eaSErich Keane 
26dc20a0eaSErich Keane void Test() {
27dc20a0eaSErich Keane #pragma acc kernels num_gangs(1)
28dc20a0eaSErich Keane   while(1);
29dc20a0eaSErich Keane 
30dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
31dc20a0eaSErich Keane #pragma acc serial num_gangs(1)
32dc20a0eaSErich Keane   while(1);
33dc20a0eaSErich Keane 
34dc20a0eaSErich Keane #pragma acc parallel num_gangs(1)
35dc20a0eaSErich Keane   while(1);
36dc20a0eaSErich Keane 
37dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
38dc20a0eaSErich Keane #pragma acc serial num_gangs(some_short(), some_int(), some_long())
39dc20a0eaSErich Keane   while(1);
40dc20a0eaSErich Keane 
41dc20a0eaSErich Keane #pragma acc parallel num_gangs(some_short(), some_int(), some_long())
42dc20a0eaSErich Keane   while(1);
43dc20a0eaSErich Keane 
44dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
45dc20a0eaSErich Keane #pragma acc serial num_gangs(some_short(), some_int(), some_long(), SomeE)
46dc20a0eaSErich Keane   while(1);
47dc20a0eaSErich Keane 
48dc20a0eaSErich Keane   // expected-error@+1{{too many integer expression arguments provided to OpenACC 'num_gangs' clause: 'parallel' directive expects maximum of 3, 4 were provided}}
49dc20a0eaSErich Keane #pragma acc parallel num_gangs(some_short(), some_int(), some_long(), SomeE)
50dc20a0eaSErich Keane   while(1);
51dc20a0eaSErich Keane 
52dc20a0eaSErich Keane   // expected-error@+1{{too many integer expression arguments provided to OpenACC 'num_gangs' clause: 'kernels' directive expects maximum of 1, 2 were provided}}
53dc20a0eaSErich Keane #pragma acc kernels num_gangs(1, 2)
54dc20a0eaSErich Keane   while(1);
55dc20a0eaSErich Keane 
56dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
57dc20a0eaSErich Keane #pragma acc serial num_gangs(1, 2)
58dc20a0eaSErich Keane   while(1);
59dc20a0eaSErich Keane 
60dc20a0eaSErich Keane #pragma acc parallel num_gangs(1, 2)
61dc20a0eaSErich Keane   while(1);
62dc20a0eaSErich Keane 
63dc20a0eaSErich Keane   // expected-error@+3{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}}
64dc20a0eaSErich Keane   // expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
65dc20a0eaSErich Keane   // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
66dc20a0eaSErich Keane #pragma acc parallel num_gangs(Ambiguous)
67dc20a0eaSErich Keane   while(1);
68dc20a0eaSErich Keane 
69dc20a0eaSErich Keane   // expected-error@+1{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}}
70dc20a0eaSErich Keane #pragma acc parallel num_gangs(NC, SomeE)
71dc20a0eaSErich Keane   while(1);
72dc20a0eaSErich Keane 
73dc20a0eaSErich Keane   // expected-error@+1{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}}
74dc20a0eaSErich Keane #pragma acc parallel num_gangs(SomeE, NC)
75dc20a0eaSErich Keane   while(1);
76dc20a0eaSErich Keane 
77*4bbdb018Serichkeane   // expected-error@+3{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}}
78dc20a0eaSErich Keane   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
79dc20a0eaSErich Keane   // expected-error@+1{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}}
80dc20a0eaSErich Keane #pragma acc parallel num_gangs(Explicit, NC)
81dc20a0eaSErich Keane   while(1);
82dc20a0eaSErich Keane 
83*4bbdb018Serichkeane   // expected-error@+4{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}}
84dc20a0eaSErich Keane   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
85dc20a0eaSErich Keane   // expected-error@+2{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}}
86dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
87dc20a0eaSErich Keane #pragma acc serial num_gangs(Explicit, NC)
88dc20a0eaSErich Keane   while(1);
89dc20a0eaSErich Keane 
90*4bbdb018Serichkeane   // expected-error@+6{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}}
91dc20a0eaSErich Keane   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
92dc20a0eaSErich Keane   // expected-error@+4{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}}
93dc20a0eaSErich Keane   // expected-error@+3{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}}
94dc20a0eaSErich Keane   // expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
95dc20a0eaSErich Keane   // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
96dc20a0eaSErich Keane #pragma acc parallel num_gangs(Explicit, NC, Ambiguous)
97dc20a0eaSErich Keane   while(1);
98dc20a0eaSErich Keane 
99*4bbdb018Serichkeane   // expected-error@+7{{OpenACC integer expression requires explicit conversion from 'struct ExplicitConvertOnly' to 'int'}}
100dc20a0eaSErich Keane   // expected-note@#EXPL_CONV{{conversion to integral type 'int'}}
101dc20a0eaSErich Keane   // expected-error@+5{{OpenACC clause 'num_gangs' requires expression of integer type ('struct NotConvertible' invalid)}}
102dc20a0eaSErich Keane   // expected-error@+4{{multiple conversions from expression type 'struct AmbiguousConvert' to an integral type}}
103dc20a0eaSErich Keane   // expected-note@#AMBIG_INT{{conversion to integral type 'int'}}
104dc20a0eaSErich Keane   // expected-note@#AMBIG_SHORT{{conversion to integral type 'short'}}
105dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
106dc20a0eaSErich Keane #pragma acc serial num_gangs(Explicit, NC, Ambiguous)
107dc20a0eaSErich Keane   while(1);
108dc20a0eaSErich Keane }
109dc20a0eaSErich Keane 
110dc20a0eaSErich Keane struct HasInt {
111dc20a0eaSErich Keane   using IntTy = int;
112dc20a0eaSErich Keane   using ShortTy = short;
113dc20a0eaSErich Keane   static constexpr int value = 1;
114dc20a0eaSErich Keane   static constexpr AmbiguousConvert ACValue;
115dc20a0eaSErich Keane   static constexpr ExplicitConvertOnly EXValue;
116dc20a0eaSErich Keane 
117dc20a0eaSErich Keane   operator char();
118dc20a0eaSErich Keane };
119dc20a0eaSErich Keane 
120dc20a0eaSErich Keane template <typename T>
121dc20a0eaSErich Keane void TestInst() {
122dc20a0eaSErich Keane   // expected-error@+2{{no member named 'Invalid' in 'HasInt'}}
123dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
124dc20a0eaSErich Keane #pragma acc serial num_gangs(HasInt::Invalid)
125dc20a0eaSErich Keane   while(1);
126dc20a0eaSErich Keane 
127dc20a0eaSErich Keane   // expected-error@+2{{no member named 'Invalid' in 'HasInt'}}
128dc20a0eaSErich Keane   // expected-note@#INST{{in instantiation of function template specialization}}
129dc20a0eaSErich Keane #pragma acc parallel num_gangs(T::Invalid)
130dc20a0eaSErich Keane   while(1);
131dc20a0eaSErich Keane 
132dc20a0eaSErich Keane   // expected-error@+1{{no member named 'Invalid' in 'HasInt'}}
133dc20a0eaSErich Keane #pragma acc parallel num_gangs(1, HasInt::Invalid)
134dc20a0eaSErich Keane   while(1);
135dc20a0eaSErich Keane 
136dc20a0eaSErich Keane   // expected-error@+1{{no member named 'Invalid' in 'HasInt'}}
137dc20a0eaSErich Keane #pragma acc parallel num_gangs(T::Invalid, 1)
138dc20a0eaSErich Keane   while(1);
139dc20a0eaSErich Keane 
140dc20a0eaSErich Keane   // expected-error@+2{{no member named 'Invalid' in 'HasInt'}}
141dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
142dc20a0eaSErich Keane #pragma acc serial num_gangs(1, HasInt::Invalid)
143dc20a0eaSErich Keane   while(1);
144dc20a0eaSErich Keane 
145dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
146dc20a0eaSErich Keane #pragma acc serial num_gangs(T::Invalid, 1)
147dc20a0eaSErich Keane   while(1);
148dc20a0eaSErich Keane 
149dc20a0eaSErich Keane #pragma acc parallel num_gangs(T::value, typename T::IntTy{})
150dc20a0eaSErich Keane   while(1);
151dc20a0eaSErich Keane 
152dc20a0eaSErich Keane   // expected-error@+1{{OpenACC 'num_gangs' clause is not valid on 'serial' directive}}
153dc20a0eaSErich Keane #pragma acc serial num_gangs(T::value, typename T::IntTy{})
154dc20a0eaSErich Keane   while(1);
155dc20a0eaSErich Keane }
156dc20a0eaSErich Keane 
157dc20a0eaSErich Keane void Inst() {
158dc20a0eaSErich Keane   TestInst<HasInt>(); // #INST
159dc20a0eaSErich Keane }
160