// ---
// DEF-LABEL: StringRef OpA::attr()
-// DEF-NEXT: auto attr = this->getAttr("attr").dyn_cast_or_null<StringAttr>();
+// DEF-NEXT: auto attr = this->getAttr("attr").cast<StringAttr>();
// DEF-NEXT: return attr.getValue();
// DEF-LABEL: OpA::verify()
// ---
// CHECK: some-return-type AOp::aAttr() {
-// CHECK-NEXT: auto attr = this->getAttr("aAttr").dyn_cast_or_null<some-attr-kind>();
+// CHECK-NEXT: auto attr = this->getAttr("aAttr").cast<some-attr-kind>();
// CHECK-NEXT: return attr.some-convert-from-storage();
// CHECK: some-return-type AOp::bAttr() {
// Emit normal emitter.
// Return the queried attribute with the correct return type.
- auto attrVal = formatv("this->getAttr(\"{0}\").dyn_cast_or_null<{1}>()",
- name, attr.getStorageType());
+ auto attrVal =
+ (attr.hasDefaultValueInitializer() || attr.isOptional())
+ ? formatv("this->getAttr(\"{0}\").dyn_cast_or_null<{1}>()", name,
+ attr.getStorageType())
+ : formatv("this->getAttr(\"{0}\").cast<{1}>()", name,
+ attr.getStorageType());
body << " auto attr = " << attrVal << ";\n";
if (attr.hasDefaultValueInitializer()) {
// Returns the default value if not set.