xref: /llvm-project/mlir/test/Dialect/IRDL/variadics.mlir (revision 1295a351bd971a437d05c340436ab711daf09152)
1*1295a351SMathieu Fehr// RUN: mlir-opt %s --irdl-file=%S/variadics.irdl.mlir -split-input-file -verify-diagnostics | FileCheck %s
2*1295a351SMathieu Fehr
3*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
4*1295a351SMathieu Fehr// Single operand
5*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
6*1295a351SMathieu Fehr
7*1295a351SMathieu Fehr// Test an operation with a single operand.
8*1295a351SMathieu Fehrfunc.func @testSingleOperand(%x: i32) {
9*1295a351SMathieu Fehr  "testvar.single_operand"(%x) : (i32) -> ()
10*1295a351SMathieu Fehr  // CHECK: "testvar.single_operand"(%{{.*}}) : (i32) -> ()
11*1295a351SMathieu Fehr  return
12*1295a351SMathieu Fehr}
13*1295a351SMathieu Fehr
14*1295a351SMathieu Fehr// -----
15*1295a351SMathieu Fehr
16*1295a351SMathieu Fehr// Test an operation with a single operand definition and a wrong number of operands.
17*1295a351SMathieu Fehrfunc.func @testSingleOperandFail(%x: i32) {
18*1295a351SMathieu Fehr  // expected-error@+1 {{op expects exactly 1 operands, but got 2}}
19*1295a351SMathieu Fehr  "testvar.single_operand"(%x, %x) : (i32, i32) -> ()
20*1295a351SMathieu Fehr  return
21*1295a351SMathieu Fehr}
22*1295a351SMathieu Fehr
23*1295a351SMathieu Fehr// -----
24*1295a351SMathieu Fehr
25*1295a351SMathieu Fehr// Test an operation with a single operand definition and a wrong number of operands.
26*1295a351SMathieu Fehrfunc.func @testSingleOperandFail() {
27*1295a351SMathieu Fehr  // expected-error@+1 {{op expects exactly 1 operands, but got 0}}
28*1295a351SMathieu Fehr  "testvar.single_operand"() : () -> ()
29*1295a351SMathieu Fehr  return
30*1295a351SMathieu Fehr}
31*1295a351SMathieu Fehr
32*1295a351SMathieu Fehr// -----
33*1295a351SMathieu Fehr
34*1295a351SMathieu Fehr
35*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
36*1295a351SMathieu Fehr// Variadic operand
37*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
38*1295a351SMathieu Fehr
39*1295a351SMathieu Fehr// Test an operation with a single variadic operand.
40*1295a351SMathieu Fehrfunc.func @testVarOperand(%x: i16, %y: i32, %z: i64) {
41*1295a351SMathieu Fehr  "testvar.var_operand"(%x, %z) : (i16, i64) -> ()
42*1295a351SMathieu Fehr  // CHECK: "testvar.var_operand"(%{{.*}}, %{{.*}}) : (i16, i64) -> ()
43*1295a351SMathieu Fehr  "testvar.var_operand"(%x, %y, %z) : (i16, i32, i64) -> ()
44*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_operand"(%{{.*}}, %{{.*}}, %{{.*}}) : (i16, i32, i64) -> ()
45*1295a351SMathieu Fehr  "testvar.var_operand"(%x, %y, %y, %z) : (i16, i32, i32, i64) -> ()
46*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_operand"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (i16, i32, i32, i64) -> ()
47*1295a351SMathieu Fehr  "testvar.var_operand"(%x, %y, %y, %y, %z) : (i16, i32, i32, i32, i64) -> ()
48*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_operand"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (i16, i32, i32, i32, i64) -> ()
49*1295a351SMathieu Fehr  return
50*1295a351SMathieu Fehr}
51*1295a351SMathieu Fehr
52*1295a351SMathieu Fehr// -----
53*1295a351SMathieu Fehr
54*1295a351SMathieu Fehr// Check that the verifier of a variadic operand  fails if the variadic is given
55*1295a351SMathieu Fehr// a wrong type.
56*1295a351SMathieu Fehrfunc.func @testVarOperandFail(%x: i16, %y: i64, %z: i64) {
57*1295a351SMathieu Fehr  // expected-error@+1 {{expected 'i32' but got 'i64'}}
58*1295a351SMathieu Fehr  "testvar.var_operand"(%x, %y, %z) : (i16, i64, i64) -> ()
59*1295a351SMathieu Fehr  return
60*1295a351SMathieu Fehr}
61*1295a351SMathieu Fehr
62*1295a351SMathieu Fehr// -----
63*1295a351SMathieu Fehr
64*1295a351SMathieu Fehr// Check that the verifier of a variadic operand fails if the variadic is given
65*1295a351SMathieu Fehr// a wrong type on the second value.
66*1295a351SMathieu Fehrfunc.func @testVarOperandFail(%x: i16, %y1: i32, %y2: i64, %z: i64) {
67*1295a351SMathieu Fehr  // expected-error@+1 {{expected 'i32' but got 'i64'}}
68*1295a351SMathieu Fehr  "testvar.var_operand"(%x, %y1, %y2, %z) : (i16, i32, i64, i64) -> ()
69*1295a351SMathieu Fehr  return
70*1295a351SMathieu Fehr}
71*1295a351SMathieu Fehr
72*1295a351SMathieu Fehr// -----
73*1295a351SMathieu Fehr
74*1295a351SMathieu Fehr// Check that if we do not give enough operands, the verifier fails.
75*1295a351SMathieu Fehrfunc.func @testVarOperandFail() {
76*1295a351SMathieu Fehr  // expected-error@+1 {{op expects at least 2 operands, but got 0}}
77*1295a351SMathieu Fehr  "testvar.var_operand"() : () -> ()
78*1295a351SMathieu Fehr  return
79*1295a351SMathieu Fehr}
80*1295a351SMathieu Fehr
81*1295a351SMathieu Fehr// -----
82*1295a351SMathieu Fehr
83*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
84*1295a351SMathieu Fehr// Optional operand
85*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
86*1295a351SMathieu Fehr
87*1295a351SMathieu Fehr
88*1295a351SMathieu Fehr// Test an operation with a single optional operand.
89*1295a351SMathieu Fehrfunc.func @testOptOperand(%x: i16, %y: i32, %z: i64) {
90*1295a351SMathieu Fehr  "testvar.opt_operand"(%x, %z) : (i16, i64) -> ()
91*1295a351SMathieu Fehr  // CHECK: "testvar.opt_operand"(%{{.*}}, %{{.*}}) : (i16, i64) -> ()
92*1295a351SMathieu Fehr  "testvar.opt_operand"(%x, %y, %z) : (i16, i32, i64) -> ()
93*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}) : (i16, i32, i64) -> ()
94*1295a351SMathieu Fehr  return
95*1295a351SMathieu Fehr}
96*1295a351SMathieu Fehr
97*1295a351SMathieu Fehr// -----
98*1295a351SMathieu Fehr
99*1295a351SMathieu Fehr// Check that the verifier of an optional operand fails if the variadic is
100*1295a351SMathieu Fehr// given a wrong type.
101*1295a351SMathieu Fehrfunc.func @testOptOperandFail(%x: i16, %y: i64, %z: i64) {
102*1295a351SMathieu Fehr  // expected-error@+1 {{expected 'i32' but got 'i64'}}
103*1295a351SMathieu Fehr  "testvar.opt_operand"(%x, %y, %z) : (i16, i64, i64) -> ()
104*1295a351SMathieu Fehr  return
105*1295a351SMathieu Fehr}
106*1295a351SMathieu Fehr
107*1295a351SMathieu Fehr// -----
108*1295a351SMathieu Fehr
109*1295a351SMathieu Fehr// Check that the verifier of an optional operand fails if there are too
110*1295a351SMathieu Fehr// many operands.
111*1295a351SMathieu Fehrfunc.func @testOptOperandFail(%x: i16, %y: i32, %z: i64) {
112*1295a351SMathieu Fehr  // expected-error@+1 {{op expects at most 3 operands, but got 4}}
113*1295a351SMathieu Fehr  "testvar.opt_operand"(%x, %y, %y, %z) : (i16, i32, i32, i64) -> ()
114*1295a351SMathieu Fehr  return
115*1295a351SMathieu Fehr}
116*1295a351SMathieu Fehr
117*1295a351SMathieu Fehr// -----
118*1295a351SMathieu Fehr
119*1295a351SMathieu Fehr// Check that the verifier of an optional operand fails if there are not
120*1295a351SMathieu Fehr// enough operands.
121*1295a351SMathieu Fehrfunc.func @testOptOperandFail(%x: i16) {
122*1295a351SMathieu Fehr  // expected-error@+1 {{op expects at least 2 operands, but got 1}}
123*1295a351SMathieu Fehr  "testvar.opt_operand"(%x) : (i16) -> ()
124*1295a351SMathieu Fehr  return
125*1295a351SMathieu Fehr}
126*1295a351SMathieu Fehr
127*1295a351SMathieu Fehr// -----
128*1295a351SMathieu Fehr
129*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
130*1295a351SMathieu Fehr// Multiple variadic
131*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
132*1295a351SMathieu Fehr
133*1295a351SMathieu Fehr// Check that an operation with multiple variadics expects the segment size
134*1295a351SMathieu Fehr// attribute
135*1295a351SMathieu Fehrfunc.func @testMultOperandsMissingSegment(%x: i16, %z: i64) {
136*1295a351SMathieu Fehr  // expected-error@+1 {{'operand_segment_sizes' attribute is expected but not provided}}
137*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"(%x, %x, %z) : (i16, i16, i64) -> ()
138*1295a351SMathieu Fehr  return
139*1295a351SMathieu Fehr}
140*1295a351SMathieu Fehr
141*1295a351SMathieu Fehr// -----
142*1295a351SMathieu Fehr
143*1295a351SMathieu Fehr// Check that an operation with multiple variadics expects the segment size
144*1295a351SMathieu Fehr// attribute of the right type
145*1295a351SMathieu Fehrfunc.func @testMultOperandsWrongSegmentType(%x: i16, %z: i64) {
146*1295a351SMathieu Fehr  // expected-error@+1 {{'operand_segment_sizes' attribute is expected to be a dense i32 array}}
147*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"(%x, %x, %z) {operand_segment_sizes = i32} : (i16, i16, i64) -> ()
148*1295a351SMathieu Fehr  return
149*1295a351SMathieu Fehr}
150*1295a351SMathieu Fehr
151*1295a351SMathieu Fehr// -----
152*1295a351SMathieu Fehr
153*1295a351SMathieu Fehr// Check that an operation with multiple variadics with the right segment size
154*1295a351SMathieu Fehr// verifies.
155*1295a351SMathieu Fehrfunc.func @testMultOperands(%x: i16, %y: i32, %z: i64) {
156*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"(%x, %x, %z) {operand_segment_sizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> ()
157*1295a351SMathieu Fehr  // CHECK: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> ()
158*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"(%x, %x, %y, %z) {operand_segment_sizes = array<i32: 2, 1, 1>} : (i16, i16, i32, i64) -> ()
159*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 2, 1, 1>} : (i16, i16, i32, i64) -> ()
160*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"(%y, %z) {operand_segment_sizes = array<i32: 0, 1, 1>} : (i32, i64) -> ()
161*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 0, 1, 1>} : (i32, i64) -> ()
162*1295a351SMathieu Fehr  return
163*1295a351SMathieu Fehr}
164*1295a351SMathieu Fehr
165*1295a351SMathieu Fehr// -----
166*1295a351SMathieu Fehr
167*1295a351SMathieu Fehr// Check that the segment sizes expects non-negative values
168*1295a351SMathieu Fehrfunc.func @testMultOperandsSegmentNegative() {
169*1295a351SMathieu Fehr  // expected-error@+1 {{'operand_segment_sizes' attribute for specifying operand segments must have non-negative values}}
170*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 2, -1, 1>} : () -> ()
171*1295a351SMathieu Fehr  return
172*1295a351SMathieu Fehr}
173*1295a351SMathieu Fehr
174*1295a351SMathieu Fehr// -----
175*1295a351SMathieu Fehr
176*1295a351SMathieu Fehr// Check that the segment sizes expects 1 for single values
177*1295a351SMathieu Fehrfunc.func @testMultOperandsSegmentWrongSingle() {
178*1295a351SMathieu Fehr  // expected-error@+1 {{element 2 in 'operand_segment_sizes' attribute must be equal to 1}}
179*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 0, 0, 0>} : () -> ()
180*1295a351SMathieu Fehr  return
181*1295a351SMathieu Fehr}
182*1295a351SMathieu Fehr
183*1295a351SMathieu Fehr// -----
184*1295a351SMathieu Fehr
185*1295a351SMathieu Fehr// Check that the segment sizes expects not more than 1 for optional values
186*1295a351SMathieu Fehrfunc.func @testMultOperandsSegmentWrongOptional() {
187*1295a351SMathieu Fehr  // expected-error@+1 {{element 1 in 'operand_segment_sizes' attribute must be equal to 0 or 1}}
188*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 0, 2, 0>} : () -> ()
189*1295a351SMathieu Fehr  return
190*1295a351SMathieu Fehr}
191*1295a351SMathieu Fehr
192*1295a351SMathieu Fehr// -----
193*1295a351SMathieu Fehr
194*1295a351SMathieu Fehr// Check that the sum of the segment sizes should be equal to the number of operands
195*1295a351SMathieu Fehrfunc.func @testMultOperandsSegmentWrongOptional(%y: i32, %z: i64) {
196*1295a351SMathieu Fehr  // expected-error@+1 {{sum of elements in 'operand_segment_sizes' attribute must be equal to the number of operands}}
197*1295a351SMathieu Fehr  "testvar.var_and_opt_operand"(%y, %z) {operand_segment_sizes = array<i32: 0, 0, 1>} : (i32, i64) -> ()
198*1295a351SMathieu Fehr  return
199*1295a351SMathieu Fehr}
200*1295a351SMathieu Fehr
201*1295a351SMathieu Fehr// -----
202*1295a351SMathieu Fehr
203*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
204*1295a351SMathieu Fehr// Single result
205*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
206*1295a351SMathieu Fehr
207*1295a351SMathieu Fehr// Test an operation with a single result.
208*1295a351SMathieu Fehrfunc.func @testSingleResult() {
209*1295a351SMathieu Fehr  %x = "testvar.single_result"() : () -> i32
210*1295a351SMathieu Fehr  // CHECK: %{{.*}} = "testvar.single_result"() : () -> i32
211*1295a351SMathieu Fehr  return
212*1295a351SMathieu Fehr}
213*1295a351SMathieu Fehr
214*1295a351SMathieu Fehr// -----
215*1295a351SMathieu Fehr
216*1295a351SMathieu Fehr// Test an operation with a single result definition and a wrong number of results.
217*1295a351SMathieu Fehrfunc.func @testSingleResultFail() {
218*1295a351SMathieu Fehr  // expected-error@+1 {{op expects exactly 1 results, but got 2}}
219*1295a351SMathieu Fehr  %x, %y = "testvar.single_result"() : () -> (i32, i32)
220*1295a351SMathieu Fehr  return
221*1295a351SMathieu Fehr}
222*1295a351SMathieu Fehr
223*1295a351SMathieu Fehr// -----
224*1295a351SMathieu Fehr
225*1295a351SMathieu Fehr// Test an operation with a single result definition and a wrong number of results.
226*1295a351SMathieu Fehrfunc.func @testSingleResultFail() {
227*1295a351SMathieu Fehr  // expected-error@+1 {{op expects exactly 1 results, but got 0}}
228*1295a351SMathieu Fehr  "testvar.single_result"() : () -> ()
229*1295a351SMathieu Fehr  return
230*1295a351SMathieu Fehr}
231*1295a351SMathieu Fehr
232*1295a351SMathieu Fehr// -----
233*1295a351SMathieu Fehr
234*1295a351SMathieu Fehr
235*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
236*1295a351SMathieu Fehr// Variadic result
237*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
238*1295a351SMathieu Fehr
239*1295a351SMathieu Fehr
240*1295a351SMathieu Fehr// Test an operation with a single variadic result.
241*1295a351SMathieu Fehrfunc.func @testVarResult() {
242*1295a351SMathieu Fehr  "testvar.var_result"() : () -> (i16, i64)
243*1295a351SMathieu Fehr  // CHECK: "testvar.var_result"() : () -> (i16, i64)
244*1295a351SMathieu Fehr  "testvar.var_result"() : () -> (i16, i32, i64)
245*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_result"() : () -> (i16, i32, i64)
246*1295a351SMathieu Fehr  "testvar.var_result"() : () -> (i16, i32, i32, i64)
247*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_result"() : () -> (i16, i32, i32, i64)
248*1295a351SMathieu Fehr  "testvar.var_result"() : () -> (i16, i32, i32, i32, i64)
249*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_result"() : () -> (i16, i32, i32, i32, i64)
250*1295a351SMathieu Fehr  return
251*1295a351SMathieu Fehr}
252*1295a351SMathieu Fehr
253*1295a351SMathieu Fehr// -----
254*1295a351SMathieu Fehr
255*1295a351SMathieu Fehr// Check that the verifier of a variadic result  fails if the variadic is given
256*1295a351SMathieu Fehr// a wrong type.
257*1295a351SMathieu Fehrfunc.func @testVarResultFail() {
258*1295a351SMathieu Fehr  // expected-error@+1 {{expected 'i32' but got 'i64'}}
259*1295a351SMathieu Fehr  "testvar.var_result"() : () -> (i16, i64, i64)
260*1295a351SMathieu Fehr  return
261*1295a351SMathieu Fehr}
262*1295a351SMathieu Fehr
263*1295a351SMathieu Fehr// -----
264*1295a351SMathieu Fehr
265*1295a351SMathieu Fehr// Check that the verifier of a variadic result fails if the variadic is given
266*1295a351SMathieu Fehr// a wrong type on the second value.
267*1295a351SMathieu Fehrfunc.func @testVarResultFail() {
268*1295a351SMathieu Fehr  // expected-error@+1 {{expected 'i32' but got 'i64'}}
269*1295a351SMathieu Fehr  "testvar.var_result"() : () -> (i16, i32, i64, i64)
270*1295a351SMathieu Fehr  return
271*1295a351SMathieu Fehr}
272*1295a351SMathieu Fehr
273*1295a351SMathieu Fehr// -----
274*1295a351SMathieu Fehr
275*1295a351SMathieu Fehr// Check that if we do not give enough results, the verifier fails.
276*1295a351SMathieu Fehrfunc.func @testVarResultFail() {
277*1295a351SMathieu Fehr  // expected-error@+1 {{op expects at least 2 results, but got 0}}
278*1295a351SMathieu Fehr  "testvar.var_result"() : () -> ()
279*1295a351SMathieu Fehr  return
280*1295a351SMathieu Fehr}
281*1295a351SMathieu Fehr
282*1295a351SMathieu Fehr// -----
283*1295a351SMathieu Fehr
284*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
285*1295a351SMathieu Fehr// Optional result
286*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
287*1295a351SMathieu Fehr
288*1295a351SMathieu Fehr
289*1295a351SMathieu Fehr// Test an operation with a single optional result.
290*1295a351SMathieu Fehrfunc.func @testOptResult() {
291*1295a351SMathieu Fehr  "testvar.opt_result"() : () -> (i16, i64)
292*1295a351SMathieu Fehr  // CHECK: "testvar.opt_result"() : () -> (i16, i64)
293*1295a351SMathieu Fehr  "testvar.opt_result"() : () -> (i16, i32, i64)
294*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.opt_result"() : () -> (i16, i32, i64)
295*1295a351SMathieu Fehr  return
296*1295a351SMathieu Fehr}
297*1295a351SMathieu Fehr
298*1295a351SMathieu Fehr// -----
299*1295a351SMathieu Fehr
300*1295a351SMathieu Fehr// Check that the verifier of an optional result fails if the variadic is
301*1295a351SMathieu Fehr// given a wrong type.
302*1295a351SMathieu Fehrfunc.func @testOptResultFail() {
303*1295a351SMathieu Fehr  // expected-error@+1 {{expected 'i32' but got 'i64'}}
304*1295a351SMathieu Fehr  "testvar.opt_result"() : () -> (i16, i64, i64)
305*1295a351SMathieu Fehr  return
306*1295a351SMathieu Fehr}
307*1295a351SMathieu Fehr
308*1295a351SMathieu Fehr// -----
309*1295a351SMathieu Fehr
310*1295a351SMathieu Fehr// Check that the verifier of an optional result fails if there are too
311*1295a351SMathieu Fehr// many results.
312*1295a351SMathieu Fehrfunc.func @testOptResultFail() {
313*1295a351SMathieu Fehr  // expected-error@+1 {{op expects at most 3 results, but got 4}}
314*1295a351SMathieu Fehr  "testvar.opt_result"() : () -> (i16, i32, i32, i64)
315*1295a351SMathieu Fehr  return
316*1295a351SMathieu Fehr}
317*1295a351SMathieu Fehr
318*1295a351SMathieu Fehr// -----
319*1295a351SMathieu Fehr
320*1295a351SMathieu Fehr// Check that the verifier of an optional result fails if there are not
321*1295a351SMathieu Fehr// enough results.
322*1295a351SMathieu Fehrfunc.func @testOptResultFail() {
323*1295a351SMathieu Fehr  // expected-error@+1 {{op expects at least 2 results, but got 1}}
324*1295a351SMathieu Fehr  "testvar.opt_result"() : () -> (i16)
325*1295a351SMathieu Fehr  return
326*1295a351SMathieu Fehr}
327*1295a351SMathieu Fehr
328*1295a351SMathieu Fehr// -----
329*1295a351SMathieu Fehr
330*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
331*1295a351SMathieu Fehr// Multiple variadic
332*1295a351SMathieu Fehr//===----------------------------------------------------------------------===//
333*1295a351SMathieu Fehr
334*1295a351SMathieu Fehr// Check that an operation with multiple variadics expects the segment size
335*1295a351SMathieu Fehr// attribute
336*1295a351SMathieu Fehrfunc.func @testMultResultsMissingSegment() {
337*1295a351SMathieu Fehr  // expected-error@+1 {{'result_segment_sizes' attribute is expected but not provided}}
338*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() : () -> (i16, i16, i64)
339*1295a351SMathieu Fehr  return
340*1295a351SMathieu Fehr}
341*1295a351SMathieu Fehr
342*1295a351SMathieu Fehr// -----
343*1295a351SMathieu Fehr
344*1295a351SMathieu Fehr// Check that an operation with multiple variadics expects the segment size
345*1295a351SMathieu Fehr// attribute of the right type
346*1295a351SMathieu Fehrfunc.func @testMultResultsWrongSegmentType() {
347*1295a351SMathieu Fehr  // expected-error@+1 {{'result_segment_sizes' attribute is expected to be a dense i32 array}}
348*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() {result_segment_sizes = i32} : () -> (i16, i16, i64)
349*1295a351SMathieu Fehr  return
350*1295a351SMathieu Fehr}
351*1295a351SMathieu Fehr
352*1295a351SMathieu Fehr// -----
353*1295a351SMathieu Fehr
354*1295a351SMathieu Fehr// Check that an operation with multiple variadics with the right segment size
355*1295a351SMathieu Fehr// verifies.
356*1295a351SMathieu Fehrfunc.func @testMultResults() {
357*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64)
358*1295a351SMathieu Fehr  // CHECK: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64)
359*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 1, 1>} : () -> (i16, i16, i32, i64)
360*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 1, 1>} : () -> (i16, i16, i32, i64)
361*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 1, 1>} : () -> (i32, i64)
362*1295a351SMathieu Fehr  // CHECK-NEXT: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 1, 1>} : () -> (i32, i64)
363*1295a351SMathieu Fehr  return
364*1295a351SMathieu Fehr}
365*1295a351SMathieu Fehr
366*1295a351SMathieu Fehr// -----
367*1295a351SMathieu Fehr
368*1295a351SMathieu Fehr// Check that the segment sizes expects non-negative values
369*1295a351SMathieu Fehrfunc.func @testMultResultsSegmentNegative() {
370*1295a351SMathieu Fehr  // expected-error@+1 {{'result_segment_sizes' attribute for specifying result segments must have non-negative values}}
371*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, -1, 1>} : () -> ()
372*1295a351SMathieu Fehr  return
373*1295a351SMathieu Fehr}
374*1295a351SMathieu Fehr
375*1295a351SMathieu Fehr// -----
376*1295a351SMathieu Fehr
377*1295a351SMathieu Fehr// Check that the segment sizes expects 1 for single values
378*1295a351SMathieu Fehrfunc.func @testMultResultsSegmentWrongSingle() {
379*1295a351SMathieu Fehr  // expected-error@+1 {{element 2 in 'result_segment_sizes' attribute must be equal to 1}}
380*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 0, 0>} : () -> ()
381*1295a351SMathieu Fehr  return
382*1295a351SMathieu Fehr}
383*1295a351SMathieu Fehr
384*1295a351SMathieu Fehr// -----
385*1295a351SMathieu Fehr
386*1295a351SMathieu Fehr// Check that the segment sizes expects not more than 1 for optional values
387*1295a351SMathieu Fehrfunc.func @testMultResultsSegmentWrongOptional() {
388*1295a351SMathieu Fehr  // expected-error@+1 {{element 1 in 'result_segment_sizes' attribute must be equal to 0 or 1}}
389*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 2, 0>} : () -> ()
390*1295a351SMathieu Fehr  return
391*1295a351SMathieu Fehr}
392*1295a351SMathieu Fehr
393*1295a351SMathieu Fehr// -----
394*1295a351SMathieu Fehr
395*1295a351SMathieu Fehr// Check that the sum of the segment sizes should be equal to the number of results
396*1295a351SMathieu Fehrfunc.func @testMultResultsSegmentWrongOptional() {
397*1295a351SMathieu Fehr  // expected-error@+1 {{sum of elements in 'result_segment_sizes' attribute must be equal to the number of results}}
398*1295a351SMathieu Fehr  "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 0, 1>} : () -> (i32, i64)
399*1295a351SMathieu Fehr  return
400*1295a351SMathieu Fehr}
401