diff --git a/mlir/include/mlir/IR/BuiltinAttributes.td b/mlir/include/mlir/IR/BuiltinAttributes.td --- a/mlir/include/mlir/IR/BuiltinAttributes.td +++ b/mlir/include/mlir/IR/BuiltinAttributes.td @@ -176,7 +176,7 @@ Examples: ```mlir - array + array array array ``` diff --git a/mlir/lib/AsmParser/AttributeParser.cpp b/mlir/lib/AsmParser/AttributeParser.cpp --- a/mlir/lib/AsmParser/AttributeParser.cpp +++ b/mlir/lib/AsmParser/AttributeParser.cpp @@ -838,16 +838,16 @@ Attribute Parser::parseDenseArrayAttr(Type type) { consumeToken(Token::kw_array); SMLoc typeLoc = getToken().getLoc(); - if (parseToken(Token::less, "expected '<' after 'array'")) - return {}; - if (!type && - (!(type = parseType()) || - parseToken(Token::colon, "expected ':' after dense array type"))) + if (parseToken(Token::less, "expected '<' after 'array'") || + (!type &&!(type = parseType()))) return {}; CustomAsmParser parser(*this); Attribute result; // Check for empty list. bool isEmptyList = getToken().is(Token::greater); + if (!isEmptyList && + parseToken(Token::colon, "expected ':' after dense array type")) + return {}; if (auto intType = type.dyn_cast()) { switch (type.getIntOrFloatBitWidth()) { diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp --- a/mlir/lib/IR/AsmPrinter.cpp +++ b/mlir/lib/IR/AsmPrinter.cpp @@ -1860,9 +1860,9 @@ } } else if (auto denseArrayAttr = attr.dyn_cast()) { typeElision = AttrTypeElision::Must; - os << "array<" << denseArrayAttr.getType().getElementType() << ":"; + os << "array<" << denseArrayAttr.getType().getElementType(); if (denseArrayAttr.size()) - os << " "; + os << ": "; denseArrayAttr.printWithoutBraces(os); os << ">"; } else if (auto resourceAttr = attr.dyn_cast()) { diff --git a/mlir/test/IR/attribute.mlir b/mlir/test/IR/attribute.mlir --- a/mlir/test/IR/attribute.mlir +++ b/mlir/test/IR/attribute.mlir @@ -522,20 +522,20 @@ // CHECK-LABEL: func @dense_array_attr func.func @dense_array_attr() attributes { -// CHECK-SAME: emptyf32attr = array, - emptyf32attr = array, -// CHECK-SAME: emptyf64attr = array, - emptyf64attr = array, -// CHECK-SAME: emptyi16attr = array, - emptyi16attr = array, -// CHECK-SAME: emptyi1attr = array, - emptyi1attr = array, -// CHECK-SAME: emptyi32attr = array, - emptyi32attr = array, -// CHECK-SAME: emptyi64attr = array, - emptyi64attr = array, -// CHECK-SAME: emptyi8attr = array, - emptyi8attr = array, +// CHECK-SAME: emptyf32attr = array, + emptyf32attr = array, +// CHECK-SAME: emptyf64attr = array, + emptyf64attr = array, +// CHECK-SAME: emptyi16attr = array, + emptyi16attr = array, +// CHECK-SAME: emptyi1attr = array, + emptyi1attr = array, +// CHECK-SAME: emptyi32attr = array, + emptyi32attr = array, +// CHECK-SAME: emptyi64attr = array, + emptyi64attr = array, +// CHECK-SAME: emptyi8attr = array, + emptyi8attr = array, // CHECK-SAME: f32attr = array, f32attr = array, // CHECK-SAME: f64attr = array,