Fix GCC build problem with 288f05f related to SmallVector. (#116958)
[llvm-project.git] / mlir / test / mlir-tblgen / attrdefs.td
blob35d2c49619ee69c6fd21a02ecc8f59fcdcdb76d0
1 // RUN: mlir-tblgen -gen-attrdef-decls -I %S/../../include %s | FileCheck %s --check-prefix=DECL
2 // RUN: mlir-tblgen -gen-attrdef-defs -I %S/../../include %s | FileCheck %s --check-prefix=DEF
4 include "mlir/IR/AttrTypeBase.td"
5 include "mlir/IR/OpBase.td"
7 // DECL: #ifdef GET_ATTRDEF_CLASSES
8 // DECL: #undef GET_ATTRDEF_CLASSES
10 // DECL: namespace mlir {
11 // DECL: class AsmParser;
12 // DECL: class AsmPrinter;
13 // DECL: } // namespace mlir
15 // DEF: #ifdef GET_ATTRDEF_LIST
16 // DEF: #undef GET_ATTRDEF_LIST
17 // DEF: ::test::IndexAttr,
18 // DEF: ::test::SimpleAAttr,
19 // DEF: ::test::CompoundAAttr,
20 // DEF: ::test::SingleParameterAttr
22 // DEF-LABEL: ::mlir::OptionalParseResult generatedAttributeParser(
23 // DEF-SAME: ::mlir::AsmParser &parser,
24 // DEF-SAME: ::llvm::StringRef *mnemonic, ::mlir::Type type,
25 // DEF-SAME: ::mlir::Attribute &value) {
26 // DEF: return ::mlir::AsmParser::KeywordSwitch<::mlir::OptionalParseResult>(parser)
27 // DEF: .Case(::test::IndexAttr::getMnemonic()
28 // DEF-NEXT:   value = ::test::IndexAttr::parse(parser, type);
29 // DEF-NEXT:   return ::mlir::success(!!value);
30 // DEF: .Case(::test::CompoundAAttr::getMnemonic()
31 // DEF-NEXT: value = ::test::CompoundAAttr::parse(parser, type);
32 // DEF-NEXT: return ::mlir::success(!!value);
33 // DEF-NEXT: })
34 // DEF: .Default([&](llvm::StringRef keyword,
35 // DEF-NEXT:   *mnemonic = keyword;
36 // DEF-NEXT:   return std::nullopt;
38 def Test_Dialect: Dialect {
39 // DECL-NOT: TestDialect
40 // DEF-NOT: TestDialect
41     let name = "TestDialect";
42     let cppNamespace = "::test";
45 class TestAttr<string name> : AttrDef<Test_Dialect, name> { }
47 def C_IndexAttr : TestAttr<"Index"> {
48     let mnemonic = "index";
50     let parameters = (
51       ins
52       StringRefParameter<"Label for index">:$label
53     );
54   let hasCustomAssemblyFormat = 1;
56 // DECL-LABEL: class IndexAttr : public ::mlir::Attribute
57 // DECL: static constexpr ::llvm::StringLiteral getMnemonic() {
58 // DECL:   return {"index"};
59 // DECL: }
60 // DECL: static ::mlir::Attribute parse(
61 // DECL-SAME: ::mlir::AsmParser &odsParser, ::mlir::Type odsType);
62 // DECL: void print(::mlir::AsmPrinter &odsPrinter) const;
65 def A_SimpleAttrA : TestAttr<"SimpleA"> {
66   let attrName = "test.simple";
67 // DECL: class SimpleAAttr : public ::mlir::Attribute
70 // A more complex parameterized type
71 def B_CompoundAttrA : TestAttr<"CompoundA"> {
72   let summary = "A more complex parameterized attribute";
73   let description = "This attribute is to test a reasonably complex attribute";
74   let mnemonic = "cmpnd_a";
75   let parameters = (
76       ins
77       "int":$widthOfSomething,
78       "::test::SimpleTypeA": $exampleTdType,
79       APFloatParameter<"">: $apFloat,
80       ArrayRefParameter<"int", "Matrix dimensions">:$dims,
81       AttributeSelfTypeParameter<"">:$inner
82   );
84   let genVerifyDecl = 1;
85   let hasCustomAssemblyFormat = 1;
87 // DECL-LABEL: class CompoundAAttr : public ::mlir::Attribute
88 // DECL: static CompoundAAttr getChecked(::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError, ::mlir::MLIRContext *context, int widthOfSomething, ::test::SimpleTypeA exampleTdType, ::llvm::APFloat apFloat, ::llvm::ArrayRef<int> dims, ::mlir::Type inner);
89 // DECL: static ::llvm::LogicalResult verify(::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError, int widthOfSomething, ::test::SimpleTypeA exampleTdType, ::llvm::APFloat apFloat, ::llvm::ArrayRef<int> dims, ::mlir::Type inner);
90 // DECL: static constexpr ::llvm::StringLiteral getMnemonic() {
91 // DECL:   return {"cmpnd_a"};
92 // DECL: }
93 // DECL: static ::mlir::Attribute parse(
94 // DECL-SAME: ::mlir::AsmParser &odsParser, ::mlir::Type odsType);
95 // DECL: void print(::mlir::AsmPrinter &odsPrinter) const;
96 // DECL: int getWidthOfSomething() const;
97 // DECL: ::test::SimpleTypeA getExampleTdType() const;
98 // DECL: ::llvm::APFloat getApFloat() const;
99 // DECL: ::mlir::Type getInner() const;
101 // Check that AttributeSelfTypeParameter is handled properly.
102 // DEF-LABEL: struct CompoundAAttrStorage
103 // DEF: CompoundAAttrStorage(
104 // DEF-SAME: inner(std::move(inner))
106 // DEF: bool operator==(const KeyTy &tblgenKey) const {
107 // DEF-NEXT: return
108 // DEF-SAME: (widthOfSomething == std::get<0>(tblgenKey)) &&
109 // DEF-SAME: (exampleTdType == std::get<1>(tblgenKey)) &&
110 // DEF-SAME: (apFloat.bitwiseIsEqual(std::get<2>(tblgenKey))) &&
111 // DEF-SAME: (dims == std::get<3>(tblgenKey)) &&
112 // DEF-SAME: (inner == std::get<4>(tblgenKey));
114 // DEF: static CompoundAAttrStorage *construct
115 // DEF: return new (allocator.allocate<CompoundAAttrStorage>())
116 // DEF-SAME: CompoundAAttrStorage(std::move(widthOfSomething), std::move(exampleTdType), std::move(apFloat), std::move(dims), std::move(inner));
118 // DEF: ::mlir::Type CompoundAAttr::getInner() const {
119 // DEF-NEXT: return getImpl()->inner;
122 def D_SingleParameterAttr : TestAttr<"SingleParameter"> {
123   let parameters = (
124     ins
125     "int": $num
126   );
127   let attrName = "test.single_parameter";
128 // DECL-LABEL: struct SingleParameterAttrStorage;
129 // DECL-LABEL: class SingleParameterAttr
130 // DECL-SAME:  detail::SingleParameterAttrStorage
133 def F_ParamWithAccessorTypeAttr : TestAttr<"ParamWithAccessorType"> {
134   let parameters = (ins AttrParameter<"std::string", "", "StringRef">:$param);
135   let attrName = "test.param_with_accessor_type";
138 // DECL-LABEL: class ParamWithAccessorTypeAttr
139 // DECL: StringRef getParam()
140 // DEF: ParamWithAccessorTypeAttrStorage
141 // DEF: ParamWithAccessorTypeAttrStorage(std::string param)
142 // DEF: StringRef ParamWithAccessorTypeAttr::getParam()
144 def G_BuilderWithReturnTypeAttr : TestAttr<"BuilderWithReturnType"> {
145   let parameters = (ins "int":$a);
146   let genVerifyDecl = 1;
147   let builders = [AttrBuilder<(ins), [{ return {}; }], "::mlir::Attribute">];
148   let attrName = "test.builder_with_return_type";
151 // DECL-LABEL: class BuilderWithReturnTypeAttr
152 // DECL: ::mlir::Attribute get(
153 // DECL: ::mlir::Attribute getChecked(
155 def H_TestExtraClassAttr : TestAttr<"TestExtraClass"> {
156   let extraClassDeclaration = [{
157     /// Test Method
158     static int getFoo(int i);
159   }];
160   let extraClassDefinition = [{
161     int $cppClass::getFoo(int i) {
162       return i+1;
163     }
164   }];
165   let attrName = "test.test_extra_class";
168 // DECL-LABEL: TestExtraClassAttr : public ::mlir::Attribute
169 // DECL: /// Test Method
170 // DECL-NEXT: static int getFoo(int i);
172 // DEF-LABEL: int TestExtraClassAttr::getFoo(int i) {
173 // DEF: return i+1;
174 // DEF-NEXT: }