diff --git a/mlir/lib/IR/Operation.cpp b/mlir/lib/IR/Operation.cpp --- a/mlir/lib/IR/Operation.cpp +++ b/mlir/lib/IR/Operation.cpp @@ -1001,8 +1001,10 @@ return op->emitOpError("requires 1D vector attribute '") << attrName << "'"; auto sizeAttrType = sizeAttr.getType().dyn_cast(); - if (!sizeAttrType || sizeAttrType.getRank() != 1) - return op->emitOpError("requires 1D vector attribute '") << attrName << "'"; + if (!sizeAttrType || sizeAttrType.getRank() != 1 || + !sizeAttrType.getElementType().isInteger(32)) + return op->emitOpError("requires 1D vector of i32 attribute '") + << attrName << "'"; if (llvm::any_of(sizeAttr.getIntValues(), [](const APInt &element) { return !element.isNonNegative(); diff --git a/mlir/test/IR/traits.mlir b/mlir/test/IR/traits.mlir --- a/mlir/test/IR/traits.mlir +++ b/mlir/test/IR/traits.mlir @@ -382,19 +382,26 @@ // ----- func @failedOperandSizeAttrWrongType(%arg: i32) { - // expected-error @+1 {{requires 1D vector attribute 'operand_segment_sizes'}} + // expected-error @+1 {{requires 1D vector of i32 attribute 'operand_segment_sizes'}} "test.attr_sized_operands"(%arg, %arg, %arg, %arg) {operand_segment_sizes = dense<[1, 1, 1, 1]>: tensor<4xi32>} : (i32, i32, i32, i32) -> () } // ----- func @failedOperandSizeAttrWrongRank(%arg: i32) { - // expected-error @+1 {{requires 1D vector attribute 'operand_segment_sizes'}} + // expected-error @+1 {{requires 1D vector of i32 attribute 'operand_segment_sizes'}} "test.attr_sized_operands"(%arg, %arg, %arg, %arg) {operand_segment_sizes = dense<[[1, 1], [1, 1]]>: vector<2x2xi32>} : (i32, i32, i32, i32) -> () } // ----- +func @failedOperandSizeAttrWrongElementType(%arg: i32) { + // expected-error @+1 {{requires 1D vector of i32 attribute 'operand_segment_sizes'}} + "test.attr_sized_operands"(%arg, %arg, %arg, %arg) {operand_segment_sizes = dense<[1, 1, 1, 1]>: vector<4xi64>} : (i32, i32, i32, i32) -> () +} + +// ----- + func @failedOperandSizeAttrNegativeValue(%arg: i32) { // expected-error @+1 {{'operand_segment_sizes' attribute cannot have negative elements}} "test.attr_sized_operands"(%arg, %arg, %arg, %arg) {operand_segment_sizes = dense<[1, 1, -1, 1]>: vector<4xi32>} : (i32, i32, i32, i32) -> () @@ -432,19 +439,26 @@ // ----- func @failedResultSizeAttrWrongType() { - // expected-error @+1 {{requires 1D vector attribute 'result_segment_sizes'}} + // expected-error @+1 {{requires 1D vector of i32 attribute 'result_segment_sizes'}} %0:4 = "test.attr_sized_results"() {result_segment_sizes = dense<[1, 1, 1, 1]>: tensor<4xi32>} : () -> (i32, i32, i32, i32) } // ----- func @failedResultSizeAttrWrongRank() { - // expected-error @+1 {{requires 1D vector attribute 'result_segment_sizes'}} + // expected-error @+1 {{requires 1D vector of i32 attribute 'result_segment_sizes'}} %0:4 = "test.attr_sized_results"() {result_segment_sizes = dense<[[1, 1], [1, 1]]>: vector<2x2xi32>} : () -> (i32, i32, i32, i32) } // ----- +func @failedResultSizeAttrWrongElementType() { + // expected-error @+1 {{requires 1D vector of i32 attribute 'result_segment_sizes'}} + %0:4 = "test.attr_sized_results"() {result_segment_sizes = dense<[1, 1, 1, 1]>: vector<4xi64>} : () -> (i32, i32, i32, i32) +} + +// ----- + func @failedResultSizeAttrNegativeValue() { // expected-error @+1 {{'result_segment_sizes' attribute cannot have negative elements}} %0:4 = "test.attr_sized_results"() {result_segment_sizes = dense<[1, 1, -1, 1]>: vector<4xi32>} : () -> (i32, i32, i32, i32)