// DEF: odsState.addAttribute("str_attr", (*odsBuilder).getStringAttr(str_attr));
// DEF: odsState.addAttribute("dv_str_attr", (*odsBuilder).getStringAttr(dv_str_attr));
+// Test derived type attr.
+// ---
+def DerivedTypeAttrOp : NS_Op<"derived_type_attr_op", []> {
+ let results = (outs AnyTensor:$output);
+ DerivedTypeAttr element_dtype = DerivedTypeAttr<"return output().getType();">;
+}
+
+// DECL: bool isDerivedAttribute
+// DEF: bool DerivedTypeAttrOp::isDerivedAttribute(StringRef name) {
+// DEF: if (name == "element_dtype") return true;
+// DEF: return false;
+// DEF: }
// Test that only default valued attributes at the end of the arguments
// list get default values in the builder signature
emitAttrWithReturnType(name, attr);
}
}
+
+ // Generate helper method to query whether a named attribute is a derived
+ // attribute. This enables, for example, avoiding adding an attribute that
+ // overlaps with a derived attribute.
+ auto &method =
+ opClass.newMethod("bool", "isDerivedAttribute", "StringRef name");
+ auto &body = method.body();
+ auto derivedAttr = make_filter_range(op.getAttributes(),
+ [](const NamedAttribute &namedAttr) {
+ return namedAttr.attr.isDerivedAttr();
+ });
+ for (auto namedAttr : derivedAttr)
+ body << " if (name == \"" << namedAttr.name << "\") return true;\n";
+ body << " return false;";
}
void OpEmitter::genAttrSetters() {