xref: /llvm-project/mlir/test/mlir-tblgen/default-type-attr-print-parser.td (revision 9750648cb44e3b201bce5878ce785228d1c005c7)
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