2018-09-20 12:35:11 +08:00
|
|
|
// RUN: mlir-opt %s -split-input-file -verify
|
2018-06-25 00:10:36 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// Check different error cases.
|
|
|
|
// -----
|
2018-06-25 02:18:29 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @illegaltype(i) // expected-error {{expected type}}
|
2018-06-25 02:18:29 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-25 23:10:46 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @illegaltype() {
|
2018-11-10 13:24:37 +08:00
|
|
|
%0 = constant splat<<vector 4 x f32>, 0> : vector<4 x f32> // expected-error {{expected type}}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @nestedtensor(tensor<tensor<i8>>) -> () // expected-error {{invalid tensor element type}}
|
2018-06-25 02:18:29 +08:00
|
|
|
|
2018-12-12 05:49:43 +08:00
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @indexvector(vector<4 x index>) -> () // expected-error {{vector elements must be int or float type}}
|
2018-12-12 05:49:43 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-04 23:23:28 +08:00
|
|
|
// Everything is valid in a memref.
|
|
|
|
func @indexmemref(memref<? x index>) -> ()
|
2018-12-12 05:49:43 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @indextensor(tensor<4 x index>) -> () // expected-error {{invalid tensor element type}}
|
2018-12-12 05:49:43 +08:00
|
|
|
|
2018-07-17 00:45:22 +08:00
|
|
|
// -----
|
|
|
|
// Test no map in memref type.
|
2019-01-03 02:20:00 +08:00
|
|
|
func @memrefs(memref<2x4xi8, >) // expected-error {{expected list element}}
|
2018-07-17 00:45:22 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
// Test non-existent map in memref type.
|
2019-01-03 02:20:00 +08:00
|
|
|
func @memrefs(memref<2x4xi8, #map7>) // expected-error {{undefined affine map id 'map7'}}
|
2018-07-17 00:45:22 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
// Test non hash identifier in memref type.
|
2019-01-03 02:20:00 +08:00
|
|
|
func @memrefs(memref<2x4xi8, %map7>) // expected-error {{expected '(' at start of dimensional identifiers list}}
|
2018-07-17 00:45:22 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
// Test non-existent map in map composition of memref type.
|
|
|
|
#map0 = (d0, d1) -> (d0, d1)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @memrefs(memref<2x4xi8, #map0, #map8>) // expected-error {{undefined affine map id 'map8'}}
|
2018-07-17 00:45:22 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
// Test multiple memory space error.
|
|
|
|
#map0 = (d0, d1) -> (d0, d1)
|
2019-01-03 02:20:00 +08:00
|
|
|
func @memrefs(memref<2x4xi8, #map0, 1, 2>) // expected-error {{multiple memory spaces specified in memref type}}
|
2018-07-17 00:45:22 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
// Test affine map after memory space.
|
|
|
|
#map0 = (d0, d1) -> (d0, d1)
|
|
|
|
#map1 = (d0, d1) -> (d0, d1)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @memrefs(memref<2x4xi8, #map0, 1, #map1>) // expected-error {{affine map after memory space in memref type}}
|
2018-07-17 00:45:22 +08:00
|
|
|
|
2018-10-26 21:15:38 +08:00
|
|
|
// -----
|
|
|
|
// Test dimension mismatch between memref and layout map.
|
|
|
|
// The error must be emitted even for the trivial identity layout maps that are
|
|
|
|
// dropped in type creation.
|
|
|
|
#map0 = (d0, d1) -> (d0, d1)
|
2019-01-03 02:20:00 +08:00
|
|
|
func @memrefs(memref<42xi8, #map0>) // expected-error {{memref affine map dimension mismatch}}
|
2018-11-02 16:48:22 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
#map0 = (d0, d1) -> (d0, d1)
|
|
|
|
#map1 = (d0) -> (d0)
|
2019-01-03 02:20:00 +08:00
|
|
|
func @memrefs(memref<42x42xi8, #map0, #map1>) // expected-error {{memref affine map dimension mismatch}}
|
2018-10-26 21:15:38 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-25 23:10:46 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @illegalattrs() -> () attributes { key } // expected-error {{expected ':' in attribute list}}
|
2018-09-19 07:36:26 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func missingsigil() -> (i1, index, f32) // expected-error {{expected a function identifier like}}
|
2018-06-25 02:18:29 +08:00
|
|
|
|
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-25 02:18:29 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @bad_branch() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb12:
|
|
|
|
br ^missing // expected-error {{reference to an undefined block}}
|
2018-06-25 02:18:29 +08:00
|
|
|
}
|
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-25 02:18:29 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @block_redef() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42:
|
2018-06-25 02:18:29 +08:00
|
|
|
return
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42: // expected-error {{redefinition of block '^bb42'}}
|
2018-06-25 23:10:46 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-25 23:10:46 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @no_terminator() { // expected-error {{block with no terminator}}
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb40:
|
2018-06-25 23:10:46 +08:00
|
|
|
return
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb41:
|
2018-12-30 05:36:59 +08:00
|
|
|
^bb42:
|
2018-06-25 02:18:29 +08:00
|
|
|
return
|
|
|
|
}
|
2018-06-29 08:02:32 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-29 08:02:32 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @block_no_rparen() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42 (%bb42 : i32: // expected-error {{expected ')' to end argument list}}
|
2018-07-23 06:45:24 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @block_arg_no_ssaid() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42 (i32): // expected-error {{expected SSA operand}}
|
2018-07-23 06:45:24 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @block_arg_no_type() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42 (%0): // expected-error {{expected ':' and type for SSA operand}}
|
2018-07-23 06:45:24 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @block_arg_no_close_paren() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42:
|
|
|
|
br ^bb2( // expected-error@+1 {{expected ')' to close argument list}}
|
2018-10-14 22:55:29 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @block_first_has_predecessor() {
|
2018-12-30 01:11:58 +08:00
|
|
|
// expected-error@-1 {{entry block of function may not have predecessors}}
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42:
|
|
|
|
br ^bb43
|
|
|
|
^bb43:
|
|
|
|
br ^bb42
|
2018-10-23 23:12:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @illegalattrs() -> ()
|
2018-09-19 07:36:26 +08:00
|
|
|
attributes { key } { // expected-error {{expected ':' in attribute list}}
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42:
|
2018-09-19 07:36:26 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @empty() {
|
2018-12-29 10:41:31 +08:00
|
|
|
} // expected-error {{function must have a body}}
|
2018-06-29 08:02:32 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-29 08:02:32 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @illegalattrs() -> ()
|
2018-09-19 07:36:26 +08:00
|
|
|
attributes { key } { // expected-error {{expected ':' in attribute list}}
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42:
|
2018-09-19 07:36:26 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @no_return() {
|
2018-12-30 01:11:58 +08:00
|
|
|
"foo"() : () -> () // expected-error {{block with no terminator}}
|
2018-08-10 03:28:58 +08:00
|
|
|
}
|
2018-06-29 11:45:33 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-29 11:45:33 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
" // expected-error {{expected}}
|
2018-06-29 11:45:33 +08:00
|
|
|
"
|
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-29 11:45:33 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
" // expected-error {{expected}}
|
2018-06-29 11:45:33 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-29 11:45:33 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @bad_op_type() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb40:
|
2018-07-19 06:31:25 +08:00
|
|
|
"foo"() : i32 // expected-error {{expected function type}}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @no_terminator() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb40:
|
2018-07-19 06:31:25 +08:00
|
|
|
"foo"() : ()->()
|
|
|
|
""() : ()->() // expected-error {{empty operation name is invalid}}
|
2018-06-29 11:45:33 +08:00
|
|
|
return
|
|
|
|
}
|
2018-06-30 13:08:05 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-06-30 13:08:05 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @illegaltype(i0) // expected-error {{invalid integer width}}
|
2018-06-30 13:08:05 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-07-04 08:51:28 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @malformed_for_percent() {
|
2018-08-10 03:28:58 +08:00
|
|
|
for i = 1 to 10 { // expected-error {{expected SSA identifier for the loop variable}}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @malformed_for_equal() {
|
2018-08-10 03:28:58 +08:00
|
|
|
for %i 1 to 10 { // expected-error {{expected '='}}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @malformed_for_to() {
|
2018-07-20 00:52:39 +08:00
|
|
|
for %i = 1 too 10 { // expected-error {{expected 'to' between bounds}}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @incomplete_for() {
|
2018-07-20 00:52:39 +08:00
|
|
|
for %i = 1 to 10 step 2
|
2018-12-29 08:05:35 +08:00
|
|
|
} // expected-error {{expected '{' before instruction list}}
|
2018-06-30 13:08:05 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-07-04 08:51:28 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @nonconstant_step(%1 : i32) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %2 = 1 to 5 step %1 { // expected-error {{expected integer}}
|
2018-07-20 00:52:39 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @for_negative_stride() {
|
2018-09-28 09:03:27 +08:00
|
|
|
for %i = 1 to 10 step -1
|
|
|
|
} // expected-error {{step has to be a positive integer}}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @non_instruction() {
|
2018-07-26 02:15:20 +08:00
|
|
|
asd // expected-error {{custom op 'asd' is unknown}}
|
2018-07-04 08:51:28 +08:00
|
|
|
}
|
2018-07-05 11:45:39 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-07-05 11:45:39 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_conditional1() {
|
2018-08-08 05:24:38 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-08-29 06:26:20 +08:00
|
|
|
if () { // expected-error {{expected ':' or '['}}
|
2018-08-08 05:24:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_conditional2() {
|
2018-08-08 05:24:38 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-08-29 06:26:20 +08:00
|
|
|
if (i)[N] : (i >= ) // expected-error {{expected '== 0' or '>= 0' at end of affine constraint}}
|
2018-08-08 05:24:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_conditional3() {
|
2018-08-08 05:24:38 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-08-29 06:26:20 +08:00
|
|
|
if (i)[N] : (i == 1) // expected-error {{expected '0' after '=='}}
|
2018-08-08 05:24:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_conditional4() {
|
2018-08-08 05:24:38 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-08-29 06:26:20 +08:00
|
|
|
if (i)[N] : (i >= 2) // expected-error {{expected '0' after '>='}}
|
2018-08-08 05:24:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_conditional5() {
|
2018-08-08 05:24:38 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-08-29 06:26:20 +08:00
|
|
|
if (i)[N] : (i <= 0 ) // expected-error {{expected '== 0' or '>= 0' at end of affine constraint}}
|
2018-08-08 05:24:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_conditional6() {
|
2018-08-08 05:24:38 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-08-29 06:26:20 +08:00
|
|
|
if (i) : (i) // expected-error {{expected '== 0' or '>= 0' at end of affine constraint}}
|
2018-08-08 05:24:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
// TODO (support if (1)?
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_conditional7() {
|
2018-08-08 05:24:38 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-08-29 06:26:20 +08:00
|
|
|
if (i) : (1) // expected-error {{expected '== 0' or '>= 0' at end of affine constraint}}
|
2018-08-08 05:24:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
#map = (d0) -> (% // expected-error {{invalid SSA name}}
|
2018-07-12 04:26:23 +08:00
|
|
|
|
2018-07-15 14:06:24 +08:00
|
|
|
// -----
|
2018-07-19 23:35:28 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @test() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb40:
|
2018-07-21 00:28:54 +08:00
|
|
|
%1 = "foo"() : (i32)->i64 // expected-error {{expected 0 operand types but had 1}}
|
2018-07-19 23:35:28 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @redef() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42:
|
2018-07-24 23:34:58 +08:00
|
|
|
%x = "xxx"(){index: 0} : ()->i32 // expected-error {{previously defined here}}
|
|
|
|
%x = "xxx"(){index: 0} : ()->i32 // expected-error {{redefinition of SSA value '%x'}}
|
2018-07-19 23:35:28 +08:00
|
|
|
return
|
2018-07-20 00:52:39 +08:00
|
|
|
}
|
|
|
|
|
2018-07-21 09:41:34 +08:00
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @undef() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42:
|
2018-07-21 09:41:34 +08:00
|
|
|
%x = "xxx"(%y) : (i32)->i32 // expected-error {{use of undeclared SSA value}}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @missing_rbrace() {
|
2018-08-10 03:28:58 +08:00
|
|
|
return
|
2019-01-03 02:20:00 +08:00
|
|
|
func @d() {return} // expected-error {{custom op 'func' is unknown}}
|
2018-07-20 00:52:39 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @malformed_type(%a : intt) { // expected-error {{expected type}}
|
2018-07-20 00:52:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @resulterror() -> i32 {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42:
|
2018-11-16 04:32:21 +08:00
|
|
|
return // expected-error {{'return' op has 0 operands, but enclosing function returns 1}}
|
2018-07-22 05:32:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
2018-07-23 06:45:24 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @func_resulterror() -> i32 {
|
2018-10-23 23:46:26 +08:00
|
|
|
return // expected-error {{'return' op has 0 operands, but enclosing function returns 1}}
|
2018-08-10 03:28:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @argError() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb1(%a: i64): // expected-error {{previously defined here}}
|
|
|
|
br ^bb2
|
|
|
|
^bb2(%a: i64): // expected-error{{redefinition of SSA value '%a'}}
|
2018-07-23 06:45:24 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @bbargMismatch(i32, f32) {
|
2018-12-30 05:36:59 +08:00
|
|
|
// expected-error @+1 {{argument and block argument type mismatch}}
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb42(%0: f32):
|
2018-07-23 06:45:24 +08:00
|
|
|
return
|
|
|
|
}
|
2018-07-23 23:42:19 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @br_mismatch() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-07-23 23:42:19 +08:00
|
|
|
%0 = "foo"() : () -> (i1, i17)
|
2018-09-07 11:56:12 +08:00
|
|
|
// expected-error @+1 {{branch has 2 operands, but target block has 1}}
|
2018-12-30 03:32:37 +08:00
|
|
|
br ^bb1(%0#1, %0#0 : i17, i1)
|
2018-07-23 23:42:19 +08:00
|
|
|
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb1(%x: i17):
|
2018-07-23 23:42:19 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-07-24 02:48:22 +08:00
|
|
|
// -----
|
|
|
|
|
|
|
|
// Test no nested vector.
|
2019-01-03 02:20:00 +08:00
|
|
|
func @vectors(vector<1 x vector<1xi32>>, vector<2x4xf32>)
|
2018-12-12 05:49:43 +08:00
|
|
|
// expected-error@-1 {{vector elements must be int or float type}}
|
Eliminate "primitive" types from being a thing, splitting them into FloatType
and OtherType. Other type is now the thing that holds AffineInt, Control,
eventually Resource, Variant, String, etc. FloatType holds the floating point
types, and allows convenient query of isa<FloatType>().
This fixes issues where we allowed control to be the element type of tensor,
memref, vector. At the same time, ban AffineInt from being an element of a
vector/memref/tensor as well since we don't need it.
I updated the spec to match this as well.
PiperOrigin-RevId: 206361942
2018-07-28 04:09:58 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @condbr_notbool() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-07-25 06:01:27 +08:00
|
|
|
%a = "foo"() : () -> i32 // expected-error {{prior use here}}
|
2018-12-30 03:32:37 +08:00
|
|
|
cond_br %a, ^bb0, ^bb0 // expected-error {{use of value '%a' expects different type than prior uses}}
|
2018-11-16 04:32:21 +08:00
|
|
|
// expected-error@-1 {{expected condition type was boolean (i1)}}
|
2018-07-25 06:01:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @condbr_badtype() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-07-25 06:01:27 +08:00
|
|
|
%c = "foo"() : () -> i1
|
|
|
|
%a = "foo"() : () -> i32
|
2018-12-30 03:32:37 +08:00
|
|
|
cond_br %c, ^bb0(%a, %a : i32, ^bb0) // expected-error {{expected type}}
|
2018-07-25 06:01:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @condbr_a_bb_is_not_a_type() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-07-25 06:01:27 +08:00
|
|
|
%c = "foo"() : () -> i1
|
|
|
|
%a = "foo"() : () -> i32
|
2018-12-30 03:32:37 +08:00
|
|
|
cond_br %c, ^bb0(%a, %a : i32, i32), i32 // expected-error {{expected block name}}
|
2018-07-25 06:01:27 +08:00
|
|
|
}
|
2018-07-27 09:09:20 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-10 04:28:30 +08:00
|
|
|
func @successors_in_unknown(%a : i32, %b : i32) {
|
|
|
|
"foo"()[^bb1] : () -> () // expected-error {{successors in non-terminator}}
|
|
|
|
^bb1:
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
func @successors_in_non_terminator(%a : i32, %b : i32) {
|
|
|
|
%c = "addi"(%a, %b)[^bb1] : () -> () // expected-error {{successors in non-terminator}}
|
|
|
|
^bb1:
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @undef() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-14 22:55:29 +08:00
|
|
|
%x = "xxx"(%y) : (i32)->i32 // expected-error {{use of undeclared SSA value name}}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @undef() {
|
2019-01-02 23:00:07 +08:00
|
|
|
%x = "xxx"(%y) : (i32)->i32 // expected-error {{use of undeclared SSA value name}}
|
2018-07-27 09:09:20 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-07-31 06:18:10 +08:00
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @duplicate_induction_var() {
|
2018-07-31 06:18:10 +08:00
|
|
|
for %i = 1 to 10 { // expected-error {{previously defined here}}
|
2018-08-01 14:14:16 +08:00
|
|
|
for %i = 1 to 10 { // expected-error {{redefinition of SSA value '%i'}}
|
2018-07-31 06:18:10 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2018-08-06 12:12:29 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @dominance_failure() {
|
2018-08-06 12:12:29 +08:00
|
|
|
for %i = 1 to 10 {
|
|
|
|
}
|
2018-10-07 08:21:53 +08:00
|
|
|
"xxx"(%i) : (index)->() // expected-error {{operand #0 does not dominate this use}}
|
2018-08-06 12:12:29 +08:00
|
|
|
return
|
|
|
|
}
|
2018-08-10 03:28:58 +08:00
|
|
|
|
2018-09-22 05:40:36 +08:00
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @dominance_failure() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-09-22 05:40:36 +08:00
|
|
|
"foo"(%x) : (i32) -> () // expected-error {{operand #0 does not dominate this use}}
|
2018-12-30 03:32:37 +08:00
|
|
|
br ^bb1
|
|
|
|
^bb1:
|
2018-09-27 22:43:44 +08:00
|
|
|
%x = "bar"() : () -> i32 // expected-note {{operand defined here}}
|
2018-09-22 05:40:36 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-08-10 03:28:58 +08:00
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @return_type_mismatch() -> i32 {
|
2018-08-10 03:28:58 +08:00
|
|
|
%0 = "foo"() : ()->f32
|
2018-09-07 11:56:12 +08:00
|
|
|
return %0 : f32 // expected-error {{type of return operand 0 doesn't match function result type}}
|
2018-08-10 03:28:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @return_inside_loop() -> i8 {
|
2018-08-10 03:28:58 +08:00
|
|
|
for %i = 1 to 100 {
|
|
|
|
%a = "foo"() : ()->i8
|
|
|
|
return %a : i8
|
2018-12-30 01:11:58 +08:00
|
|
|
// expected-error@-1 {{'return' op may only be at the top level of a function}}
|
2018-08-10 03:28:58 +08:00
|
|
|
}
|
|
|
|
}
|
2018-08-18 07:49:42 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @redef()
|
|
|
|
func @redef() // expected-error {{redefinition of function named 'redef'}}
|
2018-08-20 12:17:22 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @foo() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-08-20 12:17:22 +08:00
|
|
|
%x = constant @foo : (i32) -> () // expected-error {{reference to function with mismatched type}}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @undefined_function() {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-08-20 12:17:22 +08:00
|
|
|
%x = constant @bar : (i32) -> () // expected-error {{reference to undefined function 'bar'}}
|
|
|
|
return
|
|
|
|
}
|
2018-08-25 14:38:14 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
#map1 = (i)[j] -> (i+j)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @bound_symbol_mismatch(%N : index) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = #map1(%N) to 100 {
|
|
|
|
// expected-error@-1 {{symbol operand count and affine map symbol count must match}}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
#map1 = (i)[j] -> (i+j)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @bound_dim_mismatch(%N : index) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = #map1(%N, %N)[%N] to 100 {
|
|
|
|
// expected-error@-1 {{dim operand count and affine map dim count must match}}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
#map1 = (i)[j] -> (i+j)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_dim_nested(%N : index) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to 100 {
|
2018-10-07 08:21:53 +08:00
|
|
|
%a = "foo"(%N) : (index)->(index)
|
2018-08-25 14:38:14 +08:00
|
|
|
for %j = 1 to #map1(%a)[%i] {
|
2018-08-29 06:26:20 +08:00
|
|
|
// expected-error@-1 {{value '%a' cannot be used as a dimension id}}
|
2018-08-25 14:38:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
#map1 = (i)[j] -> (i+j)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_dim_affine_apply(%N : index) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to 100 {
|
2018-10-07 08:21:53 +08:00
|
|
|
%a = "foo"(%N) : (index)->(index)
|
2018-08-25 14:38:14 +08:00
|
|
|
%w = affine_apply (i)->(i+1) (%a)
|
|
|
|
for %j = 1 to #map1(%w)[%i] {
|
2018-08-29 06:26:20 +08:00
|
|
|
// expected-error@-1 {{value '%w' cannot be used as a dimension id}}
|
2018-08-25 14:38:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
#map1 = (i)[j] -> (i+j)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_symbol_iv(%N : index) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to 100 {
|
2018-10-07 08:21:53 +08:00
|
|
|
%a = "foo"(%N) : (index)->(index)
|
2018-08-25 14:38:14 +08:00
|
|
|
for %j = 1 to #map1(%N)[%i] {
|
2018-08-29 06:26:20 +08:00
|
|
|
// expected-error@-1 {{value '%i' cannot be used as a symbol}}
|
2018-08-25 14:38:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
#map1 = (i)[j] -> (i+j)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_symbol_nested(%N : index) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to 100 {
|
2018-10-07 08:21:53 +08:00
|
|
|
%a = "foo"(%N) : (index)->(index)
|
2018-08-25 14:38:14 +08:00
|
|
|
for %j = 1 to #map1(%N)[%a] {
|
2018-08-29 06:26:20 +08:00
|
|
|
// expected-error@-1 {{value '%a' cannot be used as a symbol}}
|
2018-08-25 14:38:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
#map1 = (i)[j] -> (i+j)
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_symbol_affine_apply(%N : index) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to 100 {
|
|
|
|
%w = affine_apply (i)->(i+1) (%i)
|
|
|
|
for %j = 1 to #map1(%i)[%w] {
|
2018-08-29 06:26:20 +08:00
|
|
|
// expected-error@-1 {{value '%w' cannot be used as a symbol}}
|
2018-08-25 14:38:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @large_bound() {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to 9223372036854775810 {
|
2018-10-07 08:21:53 +08:00
|
|
|
// expected-error@-1 {{bound or step is too large for index}}
|
2018-08-25 14:38:14 +08:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @max_in_upper_bound(%N : index) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to max (i)->(N, 100) { //expected-error {{expected SSA operand}}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @step_typo() {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to 100 step -- 1 { //expected-error {{expected integer}}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_bound_map(%N : i32) {
|
2018-08-25 14:38:14 +08:00
|
|
|
for %i = 1 to (i)->(j)(%N) { //expected-error {{use of undeclared identifier}}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2018-08-29 06:26:20 +08:00
|
|
|
|
2019-01-15 01:45:09 +08:00
|
|
|
// -----
|
|
|
|
|
|
|
|
#set0 = (i)[N, M] : )i >= 0) // expected-error {{expected '(' at start of integer set constraint list}}
|
|
|
|
|
2018-08-29 06:26:20 +08:00
|
|
|
// -----
|
2018-10-26 09:33:42 +08:00
|
|
|
#set0 = (i)[N] : (i >= 0, N - i >= 0)
|
2018-08-29 06:26:20 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_operands1(%N : index) {
|
2018-08-29 06:26:20 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-10-26 09:33:42 +08:00
|
|
|
if #set0(%i) {
|
2018-08-29 06:26:20 +08:00
|
|
|
// expected-error@-1 {{symbol operand count and integer set symbol count must match}}
|
|
|
|
|
|
|
|
// -----
|
2018-10-26 09:33:42 +08:00
|
|
|
#set0 = (i)[N] : (i >= 0, N - i >= 0)
|
2018-08-29 06:26:20 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_operands2(%N : index) {
|
2018-08-29 06:26:20 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-10-26 09:33:42 +08:00
|
|
|
if #set0()[%N] {
|
2018-08-29 06:26:20 +08:00
|
|
|
// expected-error@-1 {{dim operand count and integer set dim count must match}}
|
|
|
|
|
|
|
|
// -----
|
2018-10-26 09:33:42 +08:00
|
|
|
#set0 = (i)[N] : (i >= 0, N - i >= 0)
|
2018-08-29 06:26:20 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @invalid_if_operands3(%N : index) {
|
2018-08-29 06:26:20 +08:00
|
|
|
for %i = 1 to 10 {
|
2018-10-26 09:33:42 +08:00
|
|
|
if #set0(%i)[%i] {
|
2018-08-29 06:26:20 +08:00
|
|
|
// expected-error@-1 {{value '%i' cannot be used as a symbol}}
|
|
|
|
|
2018-10-10 05:40:41 +08:00
|
|
|
// -----
|
|
|
|
// expected-error@+1 {{expected '"' in string literal}}
|
|
|
|
"J// -----
|
2019-01-03 02:20:00 +08:00
|
|
|
func @calls(%arg0: i32) {
|
2018-10-10 05:40:41 +08:00
|
|
|
// expected-error@+1 {{expected type}}
|
|
|
|
%z = "casdasda"(%x) : (ppop32) -> i32
|
|
|
|
}
|
2018-10-14 22:55:29 +08:00
|
|
|
// -----
|
|
|
|
// expected-error@+2 {{expected SSA operand}}
|
2019-01-03 02:20:00 +08:00
|
|
|
func@n(){^b(
|
2018-10-14 22:55:29 +08:00
|
|
|
// -----
|
2018-10-19 04:54:44 +08:00
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_non_tensor_type() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-19 04:54:44 +08:00
|
|
|
"foo"(){bar: dense<i32, [4]>} : () -> () // expected-error {{expected elements literal has a tensor or vector type}}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_non_ranked() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-19 04:54:44 +08:00
|
|
|
"foo"(){bar: dense<tensor<?xi32>, [4]>} : () -> () // expected-error {{tensor literals must be ranked and have static shape}}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_shape_mismatch() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-19 04:54:44 +08:00
|
|
|
"foo"(){bar: dense<tensor<5xi32>, [4]>} : () -> () // expected-error {{inferred shape of elements literal ([1]) does not match type ([5])}}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_invalid() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-19 04:54:44 +08:00
|
|
|
"foo"(){bar: dense<tensor<2xi32>, [4, [5]]>} : () -> () // expected-error {{tensor literal is invalid; ranks are not consistent between elements}}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_badtoken() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-19 04:54:44 +08:00
|
|
|
"foo"(){bar: dense<tensor<1xi32>, [tf_opaque]>} : () -> () // expected-error {{expected '[' or scalar constant inside tensor literal}}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_floattype1() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-12-17 23:19:53 +08:00
|
|
|
// expected-error@+1 {{floating point value not valid for specified type}}
|
|
|
|
"foo"(){bar: dense<tensor<1xi32>, [4.0]>} : () -> ()
|
2018-10-19 04:54:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-05 03:27:58 +08:00
|
|
|
func @elementsattr_floattype1() -> () {
|
|
|
|
^bb0:
|
|
|
|
// expected-error@+1 {{floating point value not valid for specified type}}
|
|
|
|
"foo"(){bar: splat<tensor<i32>, 4.0>} : () -> ()
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_floattype2() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-12-17 23:19:53 +08:00
|
|
|
// expected-error@+1 {{integer value not valid for specified type}}
|
|
|
|
"foo"(){bar: dense<tensor<1xf32>, [4]>} : () -> ()
|
2018-10-19 04:54:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_toolarge1() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-12-17 23:19:53 +08:00
|
|
|
"foo"(){bar: dense<tensor<1xi8>, [777]>} : () -> () // expected-error {{integer constant out of range for attribute}}
|
2018-10-19 04:54:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_toolarge2() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-12-17 23:19:53 +08:00
|
|
|
"foo"(){bar: dense<tensor<1xi8>, [-777]>} : () -> () // expected-error {{integer constant out of range for attribute}}
|
2018-10-19 04:54:44 +08:00
|
|
|
}
|
2018-10-24 04:44:04 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_malformed_opaque() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-24 04:44:04 +08:00
|
|
|
"foo"(){bar: opaque<tensor<1xi8>, "0xQZz123">} : () -> () // expected-error {{opaque string only contains hex digits}}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @elementsattr_malformed_opaque1() -> () {
|
2018-12-30 03:32:37 +08:00
|
|
|
^bb0:
|
2018-10-24 04:44:04 +08:00
|
|
|
"foo"(){bar: opaque<tensor<1xi8>, "00abc">} : () -> () // expected-error {{opaque string should start with '0x'}}
|
2018-10-26 09:33:42 +08:00
|
|
|
}
|
2018-12-30 01:01:59 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @redundant_signature(%a : i32) -> () {
|
2018-12-30 05:36:59 +08:00
|
|
|
^bb0(%b : i32): // expected-error {{invalid block name in function with named arguments}}
|
2018-12-30 01:01:59 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @mixed_named_arguments(%a : i32,
|
2018-12-30 01:01:59 +08:00
|
|
|
f32) -> () {
|
|
|
|
// expected-error @-1 {{expected SSA identifier}}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-03 02:20:00 +08:00
|
|
|
func @mixed_named_arguments(f32,
|
2018-12-30 01:01:59 +08:00
|
|
|
%a : i32) -> () { // expected-error {{expected type instead of SSA identifier}}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-01-08 00:16:32 +08:00
|
|
|
// -----
|
|
|
|
|
|
|
|
// This used to crash the parser, but should just error out by interpreting
|
|
|
|
// `tensor` as operator rather than as a type.
|
|
|
|
func @f(f32) {
|
|
|
|
^bb0(%a : f32):
|
|
|
|
%18 = cmpi "slt", %idx, %idx : index
|
|
|
|
tensor<42 x index // expected-error {{custom op 'tensor' is unknown}}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-01-08 00:16:49 +08:00
|
|
|
// -----
|
|
|
|
|
|
|
|
func @f(%m : memref<?x?xf32>) {
|
|
|
|
for %i0 = 0 to 42 {
|
|
|
|
// expected-error@+1 {{operand #2 does not dominate this use}}
|
|
|
|
%x = load %m[%i0, %i1] : memref<?x?xf32>
|
|
|
|
}
|
|
|
|
for %i1 = 0 to 42 {
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2019-01-08 01:58:34 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-08 10:42:04 +08:00
|
|
|
func @dialect_type_empty_namespace(!<"">) -> () { // expected-error {{invalid type identifier}}
|
2019-01-08 01:58:34 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
func @dialect_type_no_string_type_data(!foo<>) -> () { // expected-error {{expected string literal type data in dialect type}}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-08 10:42:04 +08:00
|
|
|
func @dialect_type_missing_greater(!foo<"") -> () { // expected-error {{expected '>' in dialect type}}
|
2019-01-08 01:58:34 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
2019-01-08 10:42:04 +08:00
|
|
|
func @type_alias_unknown(!unknown_alias) -> () { // expected-error {{undefined type alias id 'unknown_alias'}}
|
2019-01-08 01:58:34 +08:00
|
|
|
return
|
|
|
|
}
|
2019-01-08 10:42:04 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
!missing_eq_alias type i32 // expected-error {{expected '=' in type alias definition}}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
!missing_kw_type_alias = i32 // expected-error {{expected 'type' in type alias definition}}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
!missing_type_alias = type // expected-error@+2 {{expected type}}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
!redef_alias = type i32
|
|
|
|
!redef_alias = type i32 // expected-error {{redefinition of type alias id 'redef_alias'}}
|
2019-01-12 01:03:34 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
// Check ill-formed opaque tensor.
|
|
|
|
func @complex_loops() {
|
|
|
|
for %i1 = 1 to 100 {
|
|
|
|
// expected-error @+1 {{expected '"' in string literal}}
|
|
|
|
"opaqueIntTensor"(){bar: opaque<tensor<2x1x4xi32>, "0x686]>} : () -> ()
|
2019-01-12 02:30:40 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
func @mi() {
|
|
|
|
// expected-error @+1 {{expected '[' or scalar constant inside tensor literal}}
|
|
|
|
"fooi64"(){bar: sparse<vector<1xi64>,[,[,1]
|
2019-01-12 03:23:15 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
func @invalid_tensor_literal() {
|
|
|
|
// expected-error @+1 {{expected '[' in tensor literal list}}
|
|
|
|
"foof16"(){bar: sparse<vector<1x1x1xf16>, [[0, 0, 0]], -2.0]>} : () -> ()
|