diff --git a/mlir/test/mlir-tblgen/op-attribute.td b/mlir/test/mlir-tblgen/op-attribute.td --- a/mlir/test/mlir-tblgen/op-attribute.td +++ b/mlir/test/mlir-tblgen/op-attribute.td @@ -392,6 +392,27 @@ // DEF: odsState.addAttribute(getStrAttrAttrName(odsState.name), odsBuilder.getStringAttr(str_attr)); // DEF: odsState.addAttribute(getDvStrAttrAttrName(odsState.name), odsBuilder.getStringAttr(dv_str_attr)); + +// Test default dictionary attribute. +// --- + +def DefaultDictAttrOp : NS_Op<"default_dict_attr_op", []> { + let arguments = (ins + DefaultValuedAttr:$empty, + DefaultValuedAttr:$non_empty + ); +} + +// DEF-LABEL: DefaultDictAttrOp definitions +// DEF: if (!attributes.get(attrNames[0])) +// DEF: attributes.append(attrNames[0], odsBuilder.getDictionaryAttr({})); +// DEF: if (!attributes.get(attrNames[1])) +// DEF: attributes.append(attrNames[1], odsBuilder.getDictionaryAttr(getDefaultDictAttrs(odsBuilder))); + +// DECL-LABEL: DefaultDictAttrOp declarations +// DECL: build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::DictionaryAttr empty, ::mlir::DictionaryAttr non_empty) + + // Test derived type attr. // --- def DerivedTypeAttrOp : NS_Op<"derived_type_attr_op", []> { diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp --- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp +++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp @@ -1725,8 +1725,10 @@ body << "if (!attributes.get(attrNames[" << index << "])) {\n"; FmtContext fctx; fctx.withBuilder(odsBuilder); - std::string defaultValue = std::string( - tgfmt(attr.getConstBuilderTemplate(), &fctx, attr.getDefaultValue())); + + std::string defaultValue = + std::string(tgfmt(attr.getConstBuilderTemplate(), &fctx, + tgfmt(attr.getDefaultValue(), &fctx))); body.indent() << formatv("attributes.append(attrNames[{0}], {1});\n", index, defaultValue); body.unindent() << "}\n";