10a8a5902SMarkus Böck// RUN: mlir-tblgen -gen-attrdef-defs -I %S/../../include %s | FileCheck %s --check-prefix=ATTR 20a8a5902SMarkus Böck// RUN: mlir-tblgen -gen-typedef-defs -I %S/../../include %s | FileCheck %s --check-prefix=TYPE 30a8a5902SMarkus Böck 41d7120c6SRiver Riddleinclude "mlir/IR/AttrTypeBase.td" 50a8a5902SMarkus Böckinclude "mlir/IR/OpBase.td" 60a8a5902SMarkus Böck 70a8a5902SMarkus Böck/// Test that attribute and type printers and parsers are correctly generated. 80a8a5902SMarkus Böckdef Test_Dialect : Dialect { 90a8a5902SMarkus Böck let name = "TestDialect"; 100a8a5902SMarkus Böck let cppNamespace = "::test"; 110a8a5902SMarkus Böck 120a8a5902SMarkus Böck let useDefaultAttributePrinterParser = 1; 130a8a5902SMarkus Böck 140a8a5902SMarkus Böck let useDefaultTypePrinterParser = 1; 150a8a5902SMarkus Böck} 160a8a5902SMarkus Böck 170a8a5902SMarkus Böckclass TestAttr<string name> : AttrDef<Test_Dialect, name>; 180a8a5902SMarkus Böckclass TestType<string name> : TypeDef<Test_Dialect, name>; 190a8a5902SMarkus Böck 200a8a5902SMarkus Böckdef AttrA : TestAttr<"AttrA"> { 210a8a5902SMarkus Böck let mnemonic = "attr_a"; 220a8a5902SMarkus Böck} 230a8a5902SMarkus Böck 240a8a5902SMarkus Böck// ATTR: namespace test { 250a8a5902SMarkus Böck 260a8a5902SMarkus Böck// ATTR: ::mlir::Attribute TestDialect::parseAttribute(::mlir::DialectAsmParser &parser, 270a8a5902SMarkus Böck// ATTR: ::mlir::Type type) const { 280a8a5902SMarkus Böck// ATTR: ::llvm::SMLoc typeLoc = parser.getCurrentLocation(); 290a8a5902SMarkus Böck// ATTR: ::llvm::StringRef attrTag; 300a8a5902SMarkus Böck// ATTR: { 310a8a5902SMarkus Böck// ATTR: ::mlir::Attribute attr; 32fe4f512bSRiver Riddle// ATTR: auto parseResult = generatedAttributeParser(parser, &attrTag, type, attr); 33*9750648cSKazu Hirata// ATTR: if (parseResult.has_value()) 340a8a5902SMarkus Böck// ATTR: return attr; 350a8a5902SMarkus Böck// ATTR: } 360a8a5902SMarkus Böck// ATTR: parser.emitError(typeLoc) << "unknown attribute `" 370a8a5902SMarkus Böck// ATTR: << attrTag << "` in dialect `" << getNamespace() << "`"; 380a8a5902SMarkus Böck// ATTR: return {} 390a8a5902SMarkus Böck// ATTR: } 400a8a5902SMarkus Böck 410a8a5902SMarkus Böck// ATTR: void TestDialect::printAttribute(::mlir::Attribute attr, 420a8a5902SMarkus Böck// ATTR: ::mlir::DialectAsmPrinter &printer) const { 430a8a5902SMarkus Böck// ATTR: if (::mlir::succeeded(generatedAttributePrinter(attr, printer))) 440a8a5902SMarkus Böck// ATTR: return; 450a8a5902SMarkus Böck// ATTR: } 460a8a5902SMarkus Böck 47be0a7e9fSMehdi Amini// ATTR: } // namespace test 480a8a5902SMarkus Böck 490a8a5902SMarkus Böckdef TypeA : TestType<"TypeA"> { 500a8a5902SMarkus Böck let mnemonic = "type_a"; 510a8a5902SMarkus Böck} 520a8a5902SMarkus Böck 530a8a5902SMarkus Böck// TYPE: namespace test { 540a8a5902SMarkus Böck 550a8a5902SMarkus Böck// TYPE: ::mlir::Type TestDialect::parseType(::mlir::DialectAsmParser &parser) const { 560a8a5902SMarkus Böck// TYPE: ::llvm::SMLoc typeLoc = parser.getCurrentLocation(); 570a8a5902SMarkus Böck// TYPE: ::llvm::StringRef mnemonic; 580a8a5902SMarkus Böck// TYPE: ::mlir::Type genType; 59fe4f512bSRiver Riddle// TYPE: auto parseResult = generatedTypeParser(parser, &mnemonic, genType); 60*9750648cSKazu Hirata// TYPE: if (parseResult.has_value()) 610a8a5902SMarkus Böck// TYPE: return genType; 620a8a5902SMarkus Böck// TYPE: parser.emitError(typeLoc) << "unknown type `" 630a8a5902SMarkus Böck// TYPE: << mnemonic << "` in dialect `" << getNamespace() << "`"; 640a8a5902SMarkus Böck// TYPE: return {}; 650a8a5902SMarkus Böck// TYPE: } 660a8a5902SMarkus Böck 670a8a5902SMarkus Böck// TYPE: void TestDialect::printType(::mlir::Type type, 680a8a5902SMarkus Böck// TYPE: ::mlir::DialectAsmPrinter &printer) const { 690a8a5902SMarkus Böck// TYPE: if (::mlir::succeeded(generatedTypePrinter(type, printer))) 700a8a5902SMarkus Böck// TYPE: return; 710a8a5902SMarkus Böck// TYPE: } 720a8a5902SMarkus Böck 73be0a7e9fSMehdi Amini// TYPE: } // namespace test 74