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