1// RUN: mlir-opt %s -split-input-file -allow-unregistered-dialect -verify-diagnostics | FileCheck %s
2
3//===----------------------------------------------------------------------===//
4// Test AnyAttrOf attributes
5//===----------------------------------------------------------------------===//
6
7func.func @any_attr_of_pass() {
8  "test.any_attr_of_i32_str"() {
9    // CHECK: attr = 3 : i32
10    attr = 3 : i32
11  } : () -> ()
12
13  "test.any_attr_of_i32_str"() {
14    // CHECK: attr = "string_data"
15    attr = "string_data"
16  } : () -> ()
17
18  return
19}
20
21// -----
22
23func.func @any_attr_of_fail() {
24  // expected-error @+1 {{'test.any_attr_of_i32_str' op attribute 'attr' failed to satisfy constraint: 32-bit signless integer attribute or string attribute}}
25  "test.any_attr_of_i32_str"() {
26    attr = 3 : i64
27  } : () -> ()
28
29  return
30}
31
32// -----
33
34//===----------------------------------------------------------------------===//
35// Test integer attributes
36//===----------------------------------------------------------------------===//
37
38func.func @int_attrs_pass() {
39  "test.int_attrs"() {
40    // CHECK: any_i32_attr = 5 : ui32
41    any_i32_attr = 5 : ui32,
42    // CHECK-SAME: index_attr = 8 : index
43    index_attr = 8 : index,
44    // CHECK-SAME: si32_attr = 7 : si32
45    si32_attr = 7 : si32,
46    // CHECK-SAME: ui32_attr = 6 : ui32
47    ui32_attr = 6 : ui32
48  } : () -> ()
49
50  "test.int_attrs"() {
51    // CHECK: any_i32_attr = 5 : si32
52    any_i32_attr = 5 : si32,
53    index_attr = 8 : index,
54    si32_attr = 7 : si32,
55    ui32_attr = 6 : ui32
56  } : () -> ()
57
58  "test.int_attrs"() {
59    // CHECK: any_i32_attr = 5 : i32
60    any_i32_attr = 5 : i32,
61    index_attr = 8 : index,
62    si32_attr = 7 : si32,
63    ui32_attr = 6 : ui32
64  } : () -> ()
65
66  return
67}
68
69// -----
70
71//===----------------------------------------------------------------------===//
72// Check that the maximum and minimum integer attribute values are
73// representable and preserved during a round-trip.
74//===----------------------------------------------------------------------===//
75
76func.func @int_attrs_pass() {
77  "test.in_range_attrs"() {
78    // CHECK: attr_00 = -128 : i8
79    attr_00 = -128 : i8,
80    // CHECK-SAME: attr_01 = 127 : i8
81    attr_01 = 127 : i8,
82    // CHECK-SAME: attr_02 = -128 : si8
83    attr_02 = -128 : si8,
84    // CHECK-SAME: attr_03 = 127 : si8
85    attr_03 = 127 : si8,
86    // CHECK-SAME: attr_04 = 255 : ui8
87    attr_04 = 255 : ui8,
88    // CHECK-SAME: attr_05 = -32768 : i16
89    attr_05 = -32768 : i16,
90    // CHECK-SAME: attr_06 = 32767 : i16
91    attr_06 = 32767 : i16,
92    // CHECK-SAME: attr_07 = -32768 : si16
93    attr_07 = -32768 : si16,
94    // CHECK-SAME: attr_08 = 32767 : si16
95    attr_08 = 32767 : si16,
96    // CHECK-SAME: attr_09 = 65535 : ui16
97    attr_09 = 65535 : ui16,
98    // CHECK-SAME: attr_10 = -2147483647 : i32
99    attr_10 = -2147483647 : i32,
100    // CHECK-SAME: attr_11 = 2147483646 : i32
101    attr_11 = 2147483646 : i32,
102    // CHECK-SAME: attr_12 = -2147483647 : si32
103    attr_12 = -2147483647 : si32,
104    // CHECK-SAME: attr_13 = 2147483646 : si32
105    attr_13 = 2147483646 : si32,
106    // CHECK-SAME: attr_14 = 4294967295 : ui32
107    attr_14 = 4294967295 : ui32,
108    // CHECK-SAME: attr_15 = -9223372036854775808 : i64
109    attr_15 = -9223372036854775808 : i64,
110    // CHECK-SAME: attr_16 = 9223372036854775807 : i64
111    attr_16 = 9223372036854775807 : i64,
112    // CHECK-SAME: attr_17 = -9223372036854775808 : si64
113    attr_17 = -9223372036854775808 : si64,
114    // CHECK-SAME: attr_18 = 9223372036854775807 : si64
115    attr_18 = 9223372036854775807 : si64,
116    // CHECK-SAME: attr_19 = 18446744073709551615 : ui64
117    attr_19 = 18446744073709551615 : ui64,
118    // CHECK-SAME: attr_20 = 1 : ui1
119    attr_20 = 1 : ui1,
120    // CHECK-SAME: attr_21 = -1 : si1
121    attr_21 = -1 : si1,
122    // CHECK-SAME: attr_22 = 79228162514264337593543950335 : ui96
123    attr_22 = 79228162514264337593543950335 : ui96,
124    // CHECK-SAME: attr_23 = -39614081257132168796771975168 : si96
125    attr_23 = -39614081257132168796771975168 : si96
126  } : () -> ()
127
128  return
129}
130
131// -----
132
133//===----------------------------------------------------------------------===//
134// Check that positive values larger than 2^n-1 for signless integers
135// are mapped to their negative signed counterpart. This behaviour is
136// undocumented in the language specification, but it is what the
137// parser currently does.
138//===----------------------------------------------------------------------===//
139
140func.func @int_attrs_pass() {
141  "test.i8_attr"() {
142    // CHECK: attr_00 = -1 : i8
143    attr_00 = 255 : i8,
144    // CHECK-SAME: attr_01 = -1 : i16
145    attr_01 = 65535 : i16,
146    // CHECK-SAME: attr_02 = -1 : i32
147    attr_02 = 4294967295 : i32,
148    // CHECK-SAME: attr_03 = -1 : i64
149    attr_03 = 18446744073709551615 : i64
150  } : () -> ()
151  return
152}
153
154// -----
155
156//===----------------------------------------------------------------------===//
157// Check that i0 is parsed and verified correctly. It can only have value 0.
158// We check it explicitly because there are various special cases for it that
159// are good to verify.
160//===----------------------------------------------------------------------===//
161
162func.func @int0_attrs_pass() {
163  "test.i0_attr"() {
164    // CHECK: attr_00 = 0 : i0
165    attr_00 = 0 : i0,
166    // CHECK: attr_01 = 0 : si0
167    attr_01 = 0 : si0,
168    // CHECK: attr_02 = 0 : ui0
169    attr_02 = 0 : ui0,
170    // CHECK: attr_03 = 0 : i0
171    attr_03 = 0x0000 : i0,
172    // CHECK: attr_04 = 0 : si0
173    attr_04 = 0x0000 : si0,
174    // CHECK: attr_05 = 0 : ui0
175    attr_05 = 0x0000 : ui0
176  } : () -> ()
177  return
178}
179
180// -----
181
182func.func @int0_attrs_negative_fail() {
183  "test.i0_attr"() {
184    // expected-error @+1 {{integer constant out of range for attribute}}
185    attr_00 = -1 : i0
186  } : () -> ()
187  return
188}
189
190// -----
191
192func.func @int0_attrs_positive_fail() {
193  "test.i0_attr"() {
194    // expected-error @+1 {{integer constant out of range for attribute}}
195    attr_00 = 1 : i0
196  } : () -> ()
197  return
198}
199
200// -----
201
202func.func @wrong_int_attrs_signedness_fail() {
203  // expected-error @+1 {{'si32_attr' failed to satisfy constraint: 32-bit signed integer attribute}}
204  "test.int_attrs"() {
205    any_i32_attr = 5 : i32,
206    index_attr = 8 : index,
207    si32_attr = 7 : ui32,
208    ui32_attr = 6 : ui32
209  } : () -> ()
210  return
211}
212
213// -----
214
215func.func @wrong_int_attrs_signedness_fail() {
216  // expected-error @+1 {{'ui32_attr' failed to satisfy constraint: 32-bit unsigned integer attribute}}
217  "test.int_attrs"() {
218    any_i32_attr = 5 : i32,
219    index_attr = 8 : index,
220    si32_attr = 7 : si32,
221    ui32_attr = 6 : si32
222  } : () -> ()
223  return
224}
225
226// -----
227
228func.func @wrong_int_attrs_type_fail() {
229  // expected-error @+1 {{'any_i32_attr' failed to satisfy constraint: 32-bit integer attribute}}
230  "test.int_attrs"() {
231    any_i32_attr = 5.0 : f32,
232    si32_attr = 7 : si32,
233    ui32_attr = 6 : ui32,
234    index_attr = 1 : index
235  } : () -> ()
236  return
237}
238
239// -----
240
241//===----------------------------------------------------------------------===//
242// Test Non-negative Int Attr
243//===----------------------------------------------------------------------===//
244
245func.func @non_negative_int_attr_pass() {
246  // CHECK: test.non_negative_int_attr
247  "test.non_negative_int_attr"() {i32attr = 5 : i32, i64attr = 10 : i64} : () -> ()
248  // CHECK: test.non_negative_int_attr
249  "test.non_negative_int_attr"() {i32attr = 0 : i32, i64attr = 0 : i64} : () -> ()
250  return
251}
252
253// -----
254
255func.func @negative_int_attr_fail() {
256  // expected-error @+1 {{'i32attr' failed to satisfy constraint: 32-bit signless integer attribute whose value is non-negative}}
257  "test.non_negative_int_attr"() {i32attr = -5 : i32, i64attr = 10 : i64} : () -> ()
258  return
259}
260
261// -----
262
263func.func @negative_int_attr_fail() {
264  // expected-error @+1 {{'i64attr' failed to satisfy constraint: 64-bit signless integer attribute whose value is non-negative}}
265  "test.non_negative_int_attr"() {i32attr = 5 : i32, i64attr = -10 : i64} : () -> ()
266  return
267}
268
269// -----
270
271//===----------------------------------------------------------------------===//
272// Test Positive Int Attr
273//===----------------------------------------------------------------------===//
274
275func.func @positive_int_attr_pass() {
276  // CHECK: test.positive_int_attr
277  "test.positive_int_attr"() {i32attr = 5 : i32, i64attr = 10 : i64} : () -> ()
278  return
279}
280
281// -----
282
283func.func @positive_int_attr_fail() {
284  // expected-error @+1 {{'i32attr' failed to satisfy constraint: 32-bit signless integer attribute whose value is positive}}
285  "test.positive_int_attr"() {i32attr = 0 : i32, i64attr = 5: i64} : () -> ()
286  return
287}
288
289// -----
290
291func.func @positive_int_attr_fail() {
292  // expected-error @+1 {{'i64attr' failed to satisfy constraint: 64-bit signless integer attribute whose value is positive}}
293  "test.positive_int_attr"() {i32attr = 5 : i32, i64attr = 0: i64} : () -> ()
294  return
295}
296
297// -----
298
299func.func @positive_int_attr_fail() {
300  // expected-error @+1 {{'i32attr' failed to satisfy constraint: 32-bit signless integer attribute whose value is positive}}
301  "test.positive_int_attr"() {i32attr = -10 : i32, i64attr = 5 : i64} : () -> ()
302  return
303}
304
305// -----
306
307func.func @positive_int_attr_fail() {
308  // expected-error @+1 {{'i64attr' failed to satisfy constraint: 64-bit signless integer attribute whose value is positive}}
309  "test.positive_int_attr"() {i32attr = 5 : i32, i64attr = -10 : i64} : () -> ()
310  return
311}
312
313// -----
314
315//===----------------------------------------------------------------------===//
316// Test TypeArrayAttr
317//===----------------------------------------------------------------------===//
318
319func.func @correct_type_array_attr_pass() {
320  // CHECK: test.type_array_attr
321  "test.type_array_attr"() {attr = [i32, f32]} : () -> ()
322  return
323}
324
325// -----
326
327func.func @non_type_in_type_array_attr_fail() {
328  // expected-error @+1 {{'attr' failed to satisfy constraint: type array attribute}}
329  "test.type_array_attr"() {attr = [i32, 5 : i64]} : () -> ()
330  return
331}
332
333// -----
334
335//===----------------------------------------------------------------------===//
336// Test StringAttr with custom type
337//===----------------------------------------------------------------------===//
338
339// CHECK-LABEL: func @string_attr_custom_type
340func.func @string_attr_custom_type() {
341  // CHECK: "string_data" : !foo.string
342  test.string_attr_with_type "string_data" : !foo.string
343  return
344}
345
346// -----
347
348//===----------------------------------------------------------------------===//
349// Test I32EnumAttr
350//===----------------------------------------------------------------------===//
351
352// CHECK-LABEL: func @allowed_cases_pass
353func.func @allowed_cases_pass() {
354  // CHECK: test.i32_enum_attr
355  %0 = "test.i32_enum_attr"() {attr = 5: i32} : () -> i32
356  // CHECK: test.i32_enum_attr
357  %1 = "test.i32_enum_attr"() {attr = 10: i32} : () -> i32
358  return
359}
360
361// -----
362
363func.func @disallowed_case7_fail() {
364  // expected-error @+1 {{allowed 32-bit signless integer cases: 5, 10}}
365  %0 = "test.i32_enum_attr"() {attr = 7: i32} : () -> i32
366  return
367}
368
369// -----
370
371func.func @disallowed_case7_fail() {
372  // expected-error @+1 {{allowed 32-bit signless integer cases: 5, 10}}
373  %0 = "test.i32_enum_attr"() {attr = 5: i64} : () -> i32
374  return
375}
376
377// -----
378
379//===----------------------------------------------------------------------===//
380// Test I64EnumAttr
381//===----------------------------------------------------------------------===//
382
383// CHECK-LABEL: func @allowed_cases_pass
384func.func @allowed_cases_pass() {
385  // CHECK: test.i64_enum_attr
386  %0 = "test.i64_enum_attr"() {attr = 5: i64} : () -> i32
387  // CHECK: test.i64_enum_attr
388  %1 = "test.i64_enum_attr"() {attr = 10: i64} : () -> i32
389  return
390}
391
392// -----
393
394func.func @disallowed_case7_fail() {
395  // expected-error @+1 {{allowed 64-bit signless integer cases: 5, 10}}
396  %0 = "test.i64_enum_attr"() {attr = 7: i64} : () -> i32
397  return
398}
399
400// -----
401
402func.func @disallowed_case7_fail() {
403  // expected-error @+1 {{allowed 64-bit signless integer cases: 5, 10}}
404  %0 = "test.i64_enum_attr"() {attr = 5: i32} : () -> i32
405  return
406}
407
408// -----
409
410//===----------------------------------------------------------------------===//
411// Test BitEnumAttr
412//===----------------------------------------------------------------------===//
413
414// CHECK-LABEL: func @allowed_cases_pass
415func.func @allowed_cases_pass() {
416  // CHECK: test.op_with_bit_enum <read, write>
417  "test.op_with_bit_enum"() {value = #test.bit_enum<read, write>} : () -> ()
418  // CHECK: test.op_with_bit_enum <read, execute>
419  test.op_with_bit_enum <read,execute>
420  return
421}
422
423// -----
424
425// CHECK-LABEL: func @allowed_cases_pass
426func.func @allowed_cases_pass() {
427  // CHECK: test.op_with_bit_enum_vbar <user | group>
428  "test.op_with_bit_enum_vbar"() {
429    value = #test.bit_enum_vbar<user|group>
430  } : () -> ()
431  // CHECK: test.op_with_bit_enum_vbar <user | group | other>
432  test.op_with_bit_enum_vbar <user | group | other>
433  return
434}
435
436// -----
437
438func.func @disallowed_case_sticky_fail() {
439  // expected-error@+2 {{expected test::TestBitEnum to be one of: read, write, execute}}
440  // expected-error@+1 {{failed to parse TestBitEnumAttr}}
441  "test.op_with_bit_enum"() {value = #test.bit_enum<sticky>} : () -> ()
442}
443
444// -----
445
446//===----------------------------------------------------------------------===//
447// Test FloatElementsAttr
448//===----------------------------------------------------------------------===//
449
450func.func @correct_type_pass() {
451  "test.float_elements_attr"() {
452    // CHECK: scalar_f32_attr = dense<5.000000e+00> : tensor<2xf32>
453    // CHECK: tensor_f64_attr = dense<6.000000e+00> : tensor<4x8xf64>
454    scalar_f32_attr = dense<5.0> : tensor<2xf32>,
455    tensor_f64_attr = dense<6.0> : tensor<4x8xf64>
456  } : () -> ()
457  return
458}
459
460// -----
461
462func.func @wrong_element_type_pass() {
463  // expected-error @+1 {{failed to satisfy constraint: 32-bit float elements attribute of shape [2]}}
464  "test.float_elements_attr"() {
465    scalar_f32_attr = dense<5.0> : tensor<2xf64>,
466    tensor_f64_attr = dense<6.0> : tensor<4x8xf64>
467  } : () -> ()
468  return
469}
470
471// -----
472
473func.func @correct_type_pass() {
474  // expected-error @+1 {{failed to satisfy constraint: 64-bit float elements attribute of shape [4, 8]}}
475  "test.float_elements_attr"() {
476    scalar_f32_attr = dense<5.0> : tensor<2xf32>,
477    tensor_f64_attr = dense<6.0> : tensor<4xf64>
478  } : () -> ()
479  return
480}
481
482// -----
483
484//===----------------------------------------------------------------------===//
485// Test StringElementsAttr
486//===----------------------------------------------------------------------===//
487
488func.func @simple_scalar_example() {
489  "test.string_elements_attr"() {
490    // CHECK: dense<"example">
491    scalar_string_attr = dense<"example"> : tensor<2x!unknown<"">>
492  } : () -> ()
493  return
494}
495
496// -----
497
498func.func @escape_string_example() {
499  "test.string_elements_attr"() {
500    // CHECK: dense<"new\0Aline">
501    scalar_string_attr = dense<"new\nline"> : tensor<2x!unknown<"">>
502  } : () -> ()
503  return
504}
505
506// -----
507
508func.func @simple_scalar_example() {
509  "test.string_elements_attr"() {
510    // CHECK: dense<["example1", "example2"]>
511    scalar_string_attr = dense<["example1", "example2"]> : tensor<2x!unknown<"">>
512  } : () -> ()
513  return
514}
515
516
517// -----
518
519//===----------------------------------------------------------------------===//
520// Test DenseArrayAttr
521//===----------------------------------------------------------------------===//
522
523// CHECK-LABEL: func @dense_array_attr
524func.func @dense_array_attr() attributes{
525// CHECK-SAME: emptyf32attr = [:f32],
526               emptyf32attr = [:f32],
527// CHECK-SAME: emptyf64attr = [:f64],
528               emptyf64attr = [:f64],
529// CHECK-SAME: emptyi16attr = [:i16],
530               emptyi16attr = [:i16],
531// CHECK-SAME: emptyi32attr = [:i32],
532               emptyi32attr = [:i32],
533// CHECK-SAME: emptyi64attr = [:i64],
534               emptyi64attr = [:i64],
535// CHECK-SAME: emptyi8attr = [:i8],
536               emptyi8attr = [:i8],
537// CHECK-SAME: f32attr = [:f32 1.024000e+03, 4.530000e+02, -6.435000e+03],
538               f32attr = [:f32 1024., 453., -6435.],
539// CHECK-SAME: f64attr = [:f64 -1.420000e+02],
540               f64attr = [:f64 -142.],
541// CHECK-SAME: i16attr = [:i16 3, 5, -4, 10],
542               i16attr = [:i16 3, 5, -4, 10],
543// CHECK-SAME: i32attr = [:i32 1024, 453, -6435],
544               i32attr = [:i32 1024, 453, -6435],
545// CHECK-SAME: i64attr = [:i64 -142],
546               i64attr = [:i64 -142],
547// CHECK-SAME: i8attr = [:i8 1, -2, 3]
548               i8attr = [:i8 1, -2, 3]
549 } {
550// CHECK:  test.dense_array_attr
551  test.dense_array_attr
552// CHECK-SAME: i8attr = [1, -2, 3]
553               i8attr = [1, -2, 3]
554// CHECK-SAME: i16attr = [3, 5, -4, 10]
555               i16attr = [3, 5, -4, 10]
556// CHECK-SAME: i32attr = [1024, 453, -6435]
557               i32attr = [1024, 453, -6435]
558// CHECK-SAME: i64attr = [-142]
559               i64attr = [-142]
560// CHECK-SAME: f32attr = [1.024000e+03, 4.530000e+02, -6.435000e+03]
561               f32attr = [1024., 453., -6435.]
562// CHECK-SAME: f64attr = [-1.420000e+02]
563               f64attr = [-142.]
564// CHECK-SAME: emptyattr = []
565               emptyattr = []
566  return
567}
568
569// -----
570
571//===----------------------------------------------------------------------===//
572// Test SymbolRefAttr
573//===----------------------------------------------------------------------===//
574
575func.func @fn() { return }
576
577// CHECK: test.symbol_ref_attr
578"test.symbol_ref_attr"() {symbol = @fn} : () -> ()
579
580// -----
581
582// expected-error @+1 {{referencing to a 'func::FuncOp' symbol}}
583"test.symbol_ref_attr"() {symbol = @foo} : () -> ()
584
585// -----
586
587//===----------------------------------------------------------------------===//
588// Test IntElementsAttr
589//===----------------------------------------------------------------------===//
590
591func.func @correct_int_elements_attr_pass() {
592  "test.int_elements_attr"() {
593    // CHECK: any_i32_attr = dense<5> : tensor<1x2x3x4xui32>,
594    any_i32_attr = dense<5> : tensor<1x2x3x4xui32>,
595    i32_attr = dense<5> : tensor<6xi32>
596  } : () -> ()
597
598  "test.int_elements_attr"() {
599    // CHECK: any_i32_attr = dense<5> : tensor<1x2x3x4xsi32>,
600    any_i32_attr = dense<5> : tensor<1x2x3x4xsi32>,
601    i32_attr = dense<5> : tensor<6xi32>
602  } : () -> ()
603
604  "test.int_elements_attr"() {
605    // CHECK: any_i32_attr = dense<5> : tensor<1x2x3x4xi32>,
606    any_i32_attr = dense<5> : tensor<1x2x3x4xi32>,
607    i32_attr = dense<5> : tensor<6xi32>
608  } : () -> ()
609
610  "test.index_elements_attr"() {
611    // CHECK: any_index_attr = dense<5> : tensor<1x2x3x4xindex>,
612    any_index_attr = dense<5> : tensor<1x2x3x4xindex>,
613    index_attr = dense<5> : tensor<6xindex>
614  } : () -> ()
615
616  "test.hex_index_elements_attr"() {
617    // CHECK: hex_index_attr = dense<"0x00000C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000080C0000000000001A150000000000005078000000000000B659010000000000ECBC010000000000FEC5010000000000342902000000000046320200000000007C950200000000008E9E020000000000C401030000000000D60A0300000000000C6E0300000000001E7703000000000054DA03000000000066E30300000000009C46040000000000AE4F040000000000E4B2040000000000F6BB0400000000002C1F050000000000628100000000000098E40000000000000E0C00000000000020150000000000005678000000000000BC59010000000000F2BC01000000000004C60100000000003A290200000000004C320200000000008295020000000000949E020000000000CA01030000000000DC0A030000000000126E03000000000024770300000000005ADA0300000000006CE3030000000000A246040000000000B44F040000000000EAB2040000000000FCBB040000000000321F05000000000068810000000000009EE40000000000"> : tensor<23x5xindex>
618    hex_index_attr = dense<"0x00000C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000080C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000100C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000180C000000000000080C0000000000001A150000000000005078000000000000B659010000000000ECBC010000000000FEC5010000000000342902000000000046320200000000007C950200000000008E9E020000000000C401030000000000D60A0300000000000C6E0300000000001E7703000000000054DA03000000000066E30300000000009C46040000000000AE4F040000000000E4B2040000000000F6BB0400000000002C1F050000000000628100000000000098E40000000000000E0C00000000000020150000000000005678000000000000BC59010000000000F2BC01000000000004C60100000000003A290200000000004C320200000000008295020000000000949E020000000000CA01030000000000DC0A030000000000126E03000000000024770300000000005ADA0300000000006CE3030000000000A246040000000000B44F040000000000EAB2040000000000FCBB040000000000321F05000000000068810000000000009EE40000000000"> : tensor<23x5xindex>
619  } : () -> ()
620
621  return
622}
623
624// -----
625
626func.func @wrong_int_elements_attr_type_fail() {
627  // expected-error @+1 {{'any_i32_attr' failed to satisfy constraint: 32-bit integer elements attribute}}
628  "test.int_elements_attr"() {
629    any_i32_attr = dense<5.0> : tensor<1x2x3x4xf32>,
630    i32_attr = dense<5> : tensor<6xi32>
631  } : () -> ()
632  return
633}
634
635// -----
636
637func.func @wrong_int_elements_attr_signedness_fail() {
638  // expected-error @+1 {{'i32_attr' failed to satisfy constraint: 32-bit signless integer elements attribute}}
639  "test.int_elements_attr"() {
640    any_i32_attr = dense<5> : tensor<1x2x3x4xi32>,
641    i32_attr = dense<5> : tensor<6xsi32>
642  } : () -> ()
643  return
644}
645
646// -----
647
648//===----------------------------------------------------------------------===//
649// Test Ranked IntElementsAttr
650//===----------------------------------------------------------------------===//
651
652func.func @correct_type_pass() {
653  "test.ranked_int_elements_attr"() {
654    // CHECK: matrix_i64_attr = dense<6> : tensor<4x8xi64>
655    // CHECK: vector_i32_attr = dense<5> : tensor<2xi32>
656    matrix_i64_attr = dense<6> : tensor<4x8xi64>,
657    vector_i32_attr = dense<5> : tensor<2xi32>
658  } : () -> ()
659  return
660}
661
662// -----
663
664func.func @wrong_element_type_fail() {
665  // expected-error @+1 {{failed to satisfy constraint: 32-bit signless int elements attribute of shape [2]}}
666  "test.ranked_int_elements_attr"() {
667    matrix_i64_attr = dense<6> : tensor<4x8xi64>,
668    vector_i32_attr = dense<5> : tensor<2xi64>
669  } : () -> ()
670  return
671}
672
673// -----
674
675func.func @wrong_shape_fail() {
676  // expected-error @+1 {{failed to satisfy constraint: 64-bit signless int elements attribute of shape [4, 8]}}
677  "test.ranked_int_elements_attr"() {
678    matrix_i64_attr = dense<6> : tensor<4xi64>,
679    vector_i32_attr = dense<5> : tensor<2xi32>
680  } : () -> ()
681  return
682}
683
684// -----
685
686func.func @wrong_shape_fail() {
687  // expected-error @+1 {{failed to satisfy constraint: 32-bit signless int elements attribute of shape [2]}}
688  "test.ranked_int_elements_attr"() {
689    matrix_i64_attr = dense<6> : tensor<4x8xi64>,
690    vector_i32_attr = dense<5> : tensor<i32>
691  } : () -> ()
692  return
693}
694
695// -----
696
697// expected-error @+1 {{invalid dialect namespace '"string with space"'}}
698#invalid_dialect = opaque<"string with space", "0xDEADBEEF"> : tensor<100xi32>
699
700