xref: /llvm-project/mlir/test/mlir-pdll/Parser/stmt-failure.pdll (revision 36550692340e4235550f3b9808b5e406821cc979)
1// RUN: not mlir-pdll %s -I %S -I %S/../../../include -split-input-file 2>&1 | FileCheck %s
2
3// CHECK: expected top-level declaration, such as a `Pattern`
410
5
6// -----
7
8Pattern {
9  // CHECK: expected `;` after statement
10  erase _: Op
11}
12
13// -----
14
15//===----------------------------------------------------------------------===//
16// `erase`
17//===----------------------------------------------------------------------===//
18
19Pattern {
20  // CHECK: expected expression
21  erase;
22}
23
24// -----
25
26Pattern {
27  // CHECK: expected `Op` expression
28  erase _: Attr;
29}
30
31// -----
32
33//===----------------------------------------------------------------------===//
34// `let`
35//===----------------------------------------------------------------------===//
36
37Pattern {
38  // CHECK: expected identifier after `let` to name a new variable
39  let 5;
40}
41
42// -----
43
44Pattern {
45  // CHECK: `_` may only be used to define "inline" variables
46  let _;
47}
48
49// -----
50
51Pattern {
52  // CHECK: expected expression
53  let foo: Attr<>;
54}
55
56// -----
57
58Pattern {
59  // CHECK: expected expression of `Type` in type constraint
60  let foo: Attr<_: Attr>;
61}
62
63// -----
64
65Pattern {
66  // CHECK: expected `>` after variable type constraint
67  let foo: Attr<_: Type{};
68}
69
70// -----
71
72Pattern {
73  // CHECK: the type of this variable has already been constrained
74  let foo: [Attr<_: Type>, Attr<_: Type];
75}
76
77// -----
78
79Pattern {
80  // CHECK: expected `.` after dialect namespace
81  let foo: Op<builtin>;
82}
83
84// -----
85
86Pattern {
87  // CHECK: expected operation name after dialect namespace
88  let foo: Op<builtin.>;
89}
90
91// -----
92
93Pattern {
94  // CHECK: expected `>` after operation name
95  let foo: Op<func.func<;
96}
97
98// -----
99
100Pattern {
101  // CHECK: expected expression
102  let foo: Value<>;
103}
104
105// -----
106
107Pattern {
108  // CHECK: expected expression of `Type` in type constraint
109  let foo: Value<_: Attr>;
110}
111
112// -----
113
114Pattern {
115  // CHECK: expected `>` after variable type constraint
116  let foo: Value<_: Type{};
117}
118
119// -----
120
121Pattern {
122  // CHECK: the type of this variable has already been constrained
123  let foo: [Value<_: Type>, Value<_: Type];
124}
125
126// -----
127
128Pattern {
129  // CHECK: expected expression
130  let foo: ValueRange<10>;
131}
132
133// -----
134
135Pattern {
136  // CHECK: expected expression of `TypeRange` in type constraint
137  let foo: ValueRange<_: Type>;
138}
139
140// -----
141
142Pattern {
143  // CHECK: expected `>` after variable type constraint
144  let foo: ValueRange<_: Type{};
145}
146
147// -----
148
149Pattern {
150  // CHECK: the type of this variable has already been constrained
151  let foo: [ValueRange<_: Type>, ValueRange<_: Type];
152}
153
154// -----
155
156Pattern {
157  // CHECK: unknown reference to constraint `UnknownConstraint`
158  let foo: UnknownConstraint;
159}
160
161// -----
162
163Pattern Foo {
164  erase root: Op;
165}
166
167Pattern {
168  // CHECK: invalid reference to non-constraint
169  let foo: Foo;
170}
171
172// -----
173
174Pattern {
175  // CHECK: constraint type `Attr` is incompatible with the previously inferred type `Value`
176  let foo: [Value, Attr];
177}
178
179// -----
180
181Pattern {
182  // CHECK: expected `]` after constraint list
183  let foo: [Attr[];
184}
185
186// -----
187
188Pattern {
189  // CHECK: expected expression
190  let foo: Attr = ;
191}
192
193// -----
194
195Pattern {
196  // CHECK: type constraints are not permitted on variables with initializers
197  let foo: ValueRange<_: Type> = _: Op;
198}
199
200// -----
201
202Pattern {
203  // CHECK: unable to infer type for variable `foo`
204  // CHECK: note: the type of a variable must be inferable from the constraint list or the initializer
205  let foo;
206}
207
208// -----
209
210Pattern {
211  // CHECK: unable to convert expression of type `Attr` to the expected type of `Value`
212  let foo: Value = _: Attr;
213}
214
215// -----
216
217Pattern {
218  // CHECK: :7:7: error: `foo` has already been defined
219  // CHECK: :6:7: note: see previous definition here
220  let foo: Attr;
221  let foo: Attr;
222}
223
224// -----
225
226Constraint Foo();
227
228Pattern {
229  // CHECK: unable to define variable of `Constraint` type
230  let foo = Foo;
231}
232
233// -----
234
235Rewrite Foo();
236
237Pattern {
238  // CHECK: unable to define variable of `Rewrite` type
239  let foo = Foo;
240}
241
242// -----
243
244Constraint MultiConstraint(arg1: Value, arg2: Value);
245
246Pattern {
247  // CHECK: `Constraint`s applied via a variable constraint list must take a single input, but got 2
248  let foo: MultiConstraint;
249}
250
251// -----
252
253#include "include/ops.td"
254
255Pattern {
256  // CHECK: unable to convert expression of type `Op<test.all_empty>` to the expected type of `Value`
257  // CHECK: see the definition of `test.all_empty`, which was defined with zero results
258  let value: Value = op<test.all_empty>;
259  erase _: Op;
260}
261
262// -----
263
264#include "include/ops.td"
265
266Pattern {
267  // CHECK: unable to convert expression of type `Op<test.multiple_single_result>` to the expected type of `Value`
268  // CHECK: see the definition of `test.multiple_single_result`, which was defined with at least 2 results
269  let value: Value = op<test.multiple_single_result>;
270  erase _: Op;
271}
272
273// -----
274
275//===----------------------------------------------------------------------===//
276// `replace`
277//===----------------------------------------------------------------------===//
278
279Pattern {
280  // CHECK: expected `Op` expression
281  replace attr<""> with attr<"">;
282}
283
284// -----
285
286Pattern {
287  // CHECK: expected `with` after root operation
288  replace op<>;
289}
290
291// -----
292
293Pattern {
294  // CHECK: expected `Op`, `Value` or `ValueRange` expression
295  replace op<> with attr<"">;
296}
297
298// -----
299
300Pattern {
301  // CHECK: expected `Op`, `Value` or `ValueRange` expression
302  replace op<> with (attr<"">);
303}
304
305// -----
306
307Pattern {
308  // CHECK: expected `)` after replacement values
309  replace op<>(input: Value) with (input;
310}
311
312// -----
313
314Pattern {
315  // CHECK: expected at least one replacement value, consider using `erase` if no replacement values are desired
316  replace op<>(input: Value) with ();
317}
318
319// -----
320
321Pattern {
322  // CHECK: expected dialect namespace
323  replace op<>(input: Value) with op<>;
324}
325
326// -----
327
328//===----------------------------------------------------------------------===//
329// `return`
330//===----------------------------------------------------------------------===//
331
332// CHECK: expected `;` after statement
333Constraint Foo(arg: Value) -> Value {
334  return arg
335}
336
337// -----
338
339//===----------------------------------------------------------------------===//
340// `rewrite`
341//===----------------------------------------------------------------------===//
342
343Pattern {
344  // CHECK: expected `Op` expression
345  rewrite attr<""> with { op<toy.reshape>; };
346}
347
348// -----
349
350Pattern {
351  // CHECK: expected `with` before rewrite body
352  rewrite op<>;
353}
354
355// -----
356
357Pattern {
358  // CHECK: expected `{` to start rewrite body
359  rewrite op<> with;
360}
361
362// -----
363
364Pattern {
365  // CHECK: expected dialect namespace
366  rewrite root: Op with {
367      op<>;
368  };
369}
370
371// -----
372
373Pattern {
374  // CHECK: `return` statements are only permitted within a `Constraint` or `Rewrite` body
375  rewrite root: Op with {
376      return root;
377  };
378}
379