diff --git a/mlir/examples/toy/Ch2/mlir/Dialect.cpp b/mlir/examples/toy/Ch2/mlir/Dialect.cpp --- a/mlir/examples/toy/Ch2/mlir/Dialect.cpp +++ b/mlir/examples/toy/Ch2/mlir/Dialect.cpp @@ -111,13 +111,27 @@ /// similarly to the `build` methods described above. mlir::ParseResult ConstantOp::parse(mlir::OpAsmParser &parser, mlir::OperationState &result) { - mlir::DenseElementsAttr value; - if (parser.parseOptionalAttrDict(result.attributes) || - parser.parseAttribute(value, "value", result.attributes)) - return failure(); + if (parser.parseOptionalAttrDict(result.attributes)) { + return mlir::failure(); + } + + auto attributes = result.attributes.getAttrs(); + if (attributes.size() != 1) { + return mlir::failure(); + } + + auto attribute = attributes.front(); + if (attribute.getName() != "value") { + return mlir::failure(); + } + + auto value = attribute.getValue().dyn_cast(); + if (!value) { + return mlir::failure(); + } result.addTypes(value.getType()); - return success(); + return mlir::success(); } /// The 'OpAsmPrinter' class is a stream that allows for formatting diff --git a/mlir/test/Examples/Toy/Ch2/constant.mlir b/mlir/test/Examples/Toy/Ch2/constant.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Examples/Toy/Ch2/constant.mlir @@ -0,0 +1,7 @@ +// RUN: toyc-ch2 %s -emit=mlir 2>&1 + +toy.func @single_constant() -> tensor<*xf64> { + %0 = toy.constant {value = dense<[0.]> : tensor<1xf64>} + // CHECK: toy.constant {value = dense<[0.000000e+00] : tensor<1xf64} + toy.return %0 : tensor<1xf64> +}