xref: /llvm-project/mlir/test/mlir-tblgen/attr-or-type-format-invalid.td (revision 3cbfc9d80b35b90910de2953d72d7df4bd43e4cf)
1// RUN: mlir-tblgen -gen-typedef-defs -I %S/../../include -asmformat-error-is-fatal=false %s 2>&1 | FileCheck %s
2
3include "mlir/IR/AttrTypeBase.td"
4include "mlir/IR/OpBase.td"
5
6def Test_Dialect : Dialect {
7  let name = "TestDialect";
8  let cppNamespace = "::test";
9}
10
11class InvalidType<string name, string asm> : TypeDef<Test_Dialect, name> {
12  let mnemonic = asm;
13}
14
15// Test format is missing a parameter capture.
16def InvalidTypeA : InvalidType<"InvalidTypeA", "invalid_a"> {
17  let parameters = (ins "int":$v0, "int":$v1);
18  // CHECK: format is missing reference to parameter: v1
19  let assemblyFormat = "`<` $v0 `>`";
20}
21
22// Test format has duplicate parameter captures.
23def InvalidTypeB : InvalidType<"InvalidTypeB", "invalid_b"> {
24  let parameters = (ins "int":$v0, "int":$v1);
25  // CHECK: duplicate parameter 'v0'
26  let assemblyFormat = "`<` $v0 `,` $v1 `,` $v0 `>`";
27}
28
29// Test format has invalid syntax.
30def InvalidTypeC : InvalidType<"InvalidTypeC", "invalid_c"> {
31  let parameters = (ins "int":$v0, "int":$v1);
32  // CHECK: expected literal, variable, directive, or optional group
33  let assemblyFormat = "`<` $v0, $v1 `>`";
34}
35
36// Test struct directive has invalid syntax.
37def InvalidTypeD : InvalidType<"InvalidTypeD", "invalid_d"> {
38  let parameters = (ins "int":$v0);
39  // CHECK: literals may only be used in the top-level section of the format
40  // CHECK: expected a variable in `struct` argument list
41  let assemblyFormat = "`<` struct($v0, `,`) `>`";
42}
43
44// Test struct directive cannot capture zero parameters.
45def InvalidTypeE : InvalidType<"InvalidTypeE", "invalid_e"> {
46  let parameters = (ins "int":$v0);
47  // CHECK: `struct` argument list expected a variable or directive
48  let assemblyFormat = "`<` struct() $v0 `>`";
49}
50
51// Test capture parameter that does not exist.
52def InvalidTypeF : InvalidType<"InvalidTypeF", "invalid_f"> {
53  let parameters = (ins "int":$v0);
54  // CHECK: InvalidTypeF has no parameter named 'v1'
55  let assemblyFormat = "`<` $v0 $v1 `>`";
56}
57
58// Test duplicate capture of parameter in capture-all struct.
59def InvalidTypeG : InvalidType<"InvalidTypeG", "invalid_g"> {
60  let parameters = (ins "int":$v0, "int":$v1, "int":$v2);
61  // CHECK: duplicate parameter 'v0'
62  let assemblyFormat = "`<` struct(params) $v0 `>`";
63}
64
65// Test capture-all struct duplicate capture.
66def InvalidTypeH : InvalidType<"InvalidTypeH", "invalid_h"> {
67  let parameters = (ins "int":$v0, "int":$v1, "int":$v2);
68  // CHECK: `params` captures duplicate parameter: v0
69  let assemblyFormat = "`<` $v0 struct(params) `>`";
70}
71
72// Test capture of parameter after `params` directive.
73def InvalidTypeI : InvalidType<"InvalidTypeI", "invalid_i"> {
74  let parameters = (ins "int":$v0);
75  // CHECK: duplicate parameter 'v0'
76  let assemblyFormat = "`<` params $v0 `>`";
77}
78
79// Test `struct` with optional parameter followed by comma.
80def InvalidTypeJ : InvalidType<"InvalidTypeJ", "invalid_j"> {
81  let parameters = (ins OptionalParameter<"int">:$a, "int":$b);
82  // CHECK: directive with optional parameters cannot be followed by a comma literal
83  let assemblyFormat = "struct($a) `,` $b";
84}
85
86// Test `struct` in optional group must have all optional parameters.
87def InvalidTypeK : InvalidType<"InvalidTypeK", "invalid_k"> {
88  let parameters = (ins OptionalParameter<"int">:$a, "int":$b);
89  // CHECK: is only allowed in an optional group if all captured parameters are optional
90  let assemblyFormat = "(`(` struct(params)^ `)`)?";
91}
92
93// Test `struct` in optional group must have all optional parameters.
94def InvalidTypeL : InvalidType<"InvalidTypeL", "invalid_l"> {
95  let parameters = (ins OptionalParameter<"int">:$a, "int":$b);
96  // CHECK: directive allowed in optional group only if all parameters are optional
97  let assemblyFormat = "(`(` params^ `)`)?";
98}
99
100def InvalidTypeM : InvalidType<"InvalidTypeM", "invalid_m"> {
101  let parameters = (ins OptionalParameter<"int">:$a, "int":$b);
102  // CHECK: parameters in an optional group must be optional
103  let assemblyFormat = "(`(` $a^ `,` $b `)`)?";
104}
105
106def InvalidTypeN : InvalidType<"InvalidTypeN", "invalid_n"> {
107  let parameters = (ins OptionalParameter<"int">:$a);
108  // CHECK: optional group anchor must be a parameter or directive
109  let assemblyFormat = "(`(` $a `)`^)?";
110}
111
112def InvalidTypeO : InvalidType<"InvalidTypeO", "invalid_o"> {
113  let parameters = (ins "int":$a);
114  // CHECK: 'ref' is only valid within a `custom` directive
115  let assemblyFormat = "$a ref($a)";
116}
117
118def InvalidTypeP : InvalidType<"InvalidTypeP", "invalid_p"> {
119  let parameters = (ins "int":$a);
120  // CHECK: parameter 'a' must be bound before it is referenced
121  let assemblyFormat = "custom<Foo>(ref($a)) $a";
122}
123
124def InvalidTypeQ : InvalidType<"InvalidTypeQ", "invalid_q"> {
125  let parameters = (ins "int":$a);
126  // CHECK: `params` can only be used at the top-level context or within a `struct` directive
127  let assemblyFormat = "custom<Foo>(params)";
128}
129
130def InvalidTypeR : InvalidType<"InvalidTypeR", "invalid_r"> {
131  let parameters = (ins "int":$a);
132  // CHECK: `struct` can only be used at the top-level context
133  let assemblyFormat = "custom<Foo>(struct(params))";
134}
135
136def InvalidTypeS : InvalidType<"InvalidTypeS", "invalid_s"> {
137  let parameters = (ins OptionalParameter<"int">:$a, "int":$b);
138  // CHECK: `custom` is only allowed in an optional group if all captured parameters are optional
139  let assemblyFormat = "(`(` custom<Foo>($a, $b)^ `)`)?";
140}
141
142def InvalidTypeT : InvalidType<"InvalidTypeT", "invalid_t"> {
143  let parameters = (ins OptionalParameter<"int">:$a);
144  // CHECK: `custom` directive with no bound parameters cannot be used as optional group anchor
145  let assemblyFormat = "$a (`(` custom<Foo>(ref($a))^ `)`)?";
146}
147