1// RUN: mlir-tblgen -gen-attrdef-defs -I %S/../../include %s | FileCheck %s --check-prefix=ATTR 2// RUN: mlir-tblgen -gen-typedef-defs -I %S/../../include %s | FileCheck %s --check-prefix=TYPE 3 4include "mlir/IR/AttrTypeBase.td" 5include "mlir/IR/OpBase.td" 6 7/// Test that attribute and type printers and parsers are correctly generated. 8def Test_Dialect : Dialect { 9 let name = "TestDialect"; 10 let cppNamespace = "::test"; 11 12 let useDefaultAttributePrinterParser = 1; 13 14 let useDefaultTypePrinterParser = 1; 15} 16 17class TestAttr<string name> : AttrDef<Test_Dialect, name>; 18class TestType<string name> : TypeDef<Test_Dialect, name>; 19 20def AttrA : TestAttr<"AttrA"> { 21 let mnemonic = "attr_a"; 22} 23 24// ATTR: namespace test { 25 26// ATTR: ::mlir::Attribute TestDialect::parseAttribute(::mlir::DialectAsmParser &parser, 27// ATTR: ::mlir::Type type) const { 28// ATTR: ::llvm::SMLoc typeLoc = parser.getCurrentLocation(); 29// ATTR: ::llvm::StringRef attrTag; 30// ATTR: { 31// ATTR: ::mlir::Attribute attr; 32// ATTR: auto parseResult = generatedAttributeParser(parser, &attrTag, type, attr); 33// ATTR: if (parseResult.has_value()) 34// ATTR: return attr; 35// ATTR: } 36// ATTR: parser.emitError(typeLoc) << "unknown attribute `" 37// ATTR: << attrTag << "` in dialect `" << getNamespace() << "`"; 38// ATTR: return {} 39// ATTR: } 40 41// ATTR: void TestDialect::printAttribute(::mlir::Attribute attr, 42// ATTR: ::mlir::DialectAsmPrinter &printer) const { 43// ATTR: if (::mlir::succeeded(generatedAttributePrinter(attr, printer))) 44// ATTR: return; 45// ATTR: } 46 47// ATTR: } // namespace test 48 49def TypeA : TestType<"TypeA"> { 50 let mnemonic = "type_a"; 51} 52 53// TYPE: namespace test { 54 55// TYPE: ::mlir::Type TestDialect::parseType(::mlir::DialectAsmParser &parser) const { 56// TYPE: ::llvm::SMLoc typeLoc = parser.getCurrentLocation(); 57// TYPE: ::llvm::StringRef mnemonic; 58// TYPE: ::mlir::Type genType; 59// TYPE: auto parseResult = generatedTypeParser(parser, &mnemonic, genType); 60// TYPE: if (parseResult.has_value()) 61// TYPE: return genType; 62// TYPE: parser.emitError(typeLoc) << "unknown type `" 63// TYPE: << mnemonic << "` in dialect `" << getNamespace() << "`"; 64// TYPE: return {}; 65// TYPE: } 66 67// TYPE: void TestDialect::printType(::mlir::Type type, 68// TYPE: ::mlir::DialectAsmPrinter &printer) const { 69// TYPE: if (::mlir::succeeded(generatedTypePrinter(type, printer))) 70// TYPE: return; 71// TYPE: } 72 73// TYPE: } // namespace test 74