Fix GCC build problem with 288f05f related to SmallVector. (#116958)
[llvm-project.git] / mlir / test / mlir-pdll / Parser / expr-failure.pdll
blob898fe8680a763f4053e2f959c846573590a2c988
1 // RUN: not mlir-pdll %s -I %S -I %S/../../../include -split-input-file 2>&1 | FileCheck %s
3 //===----------------------------------------------------------------------===//
4 // Reference Expr
5 //===----------------------------------------------------------------------===//
7 Pattern {
8   // CHECK: expected identifier constraint
9   let foo = Foo: ;
12 // -----
14 Pattern {
15   // CHECK: undefined reference to `bar`
16   let foo = bar;
19 // -----
21 Pattern FooPattern {
22   erase _: Op;
25 Pattern {
26   // CHECK: invalid reference to `FooPattern`
27   let foo = FooPattern;
30 // -----
32 Pattern {
33   // CHECK: expected `:` after `_` variable
34   let foo = _;
37 // -----
39 Pattern {
40   // CHECK: expected identifier constraint
41   let foo = _: ;
44 // -----
46 //===----------------------------------------------------------------------===//
47 // Call Expr
48 //===----------------------------------------------------------------------===//
50 Constraint foo(value: Value);
52 Pattern {
53   // CHECK: expected `)` after argument list
54   foo(_: Value{};
57 // -----
59 Pattern {
60   // CHECK: expected a reference to a callable `Constraint` or `Rewrite`, but got: `Op`
61   let foo: Op;
62   foo();
65 // -----
67 Constraint Foo();
69 Pattern {
70   // CHECK: invalid number of arguments for constraint call; expected 0, but got 1
71   Foo(_: Value);
74 // -----
76 Constraint Foo(arg: Value);
78 Pattern {
79   // CHECK: unable to convert expression of type `Attr` to the expected type of `Value`
80   Foo(attr<"i32">);
83 // -----
85 //===----------------------------------------------------------------------===//
86 // Member Access Expr
87 //===----------------------------------------------------------------------===//
89 Pattern {
90   // CHECK: expected identifier or numeric member name
91   let root: Op;
92   erase root.<>;
95 // -----
97 Pattern {
98   // CHECK: invalid member access `unknown_result` on expression of type `Op`
99   let root: Op;
100   erase root.unknown_result;
103 // -----
105 Pattern {
106   let tuple = (result1 = value: Value, result2 = value);
108   // CHECK: invalid member access `unknown_result` on expression of type `Tuple<result1: Value, result2: Value>`
109   let tuple2 = (tuple.result1, tuple.unknown_result);
111   erase op<>;
114 // -----
116 Pattern {
117   let tuple = (result1 = value: Value, result2 = value);
119   // CHECK: invalid member access `2` on expression of type `Tuple<result1: Value, result2: Value>`
120   let tuple2 = (tuple.0, tuple.2);
122   erase op<>;
125 // -----
127 //===----------------------------------------------------------------------===//
128 // Range Expr
129 //===----------------------------------------------------------------------===//
131 Pattern {
132   // CHECK: unable to convert expression of type `Tuple<>` to the expected type of `ValueRange`
133   // CHECK: Tuple to Range conversion is currently only allowed within a rewrite context
134   erase op<>(());
137 // -----
139 Pattern {
140   // CHECK: unable to convert expression of type `Tuple<Value, Type>` to the expected type of `ValueRange`
141   replace op<>(arg: Value) -> (type: Type) with op<test.op>((arg, type));
144 // -----
146 //===----------------------------------------------------------------------===//
147 // Tuple Expr
148 //===----------------------------------------------------------------------===//
150 Pattern {
151   // CHECK: expected `)` after tuple element list
152   let tuple = (value: Value, value;
155 // -----
157 Pattern {
158   // CHECK: unable to build a tuple with `Tuple<Value, Value>` element
159   let tuple = (_: Value, _: Value);
160   let var = (tuple);
161   erase op<>;
164 // -----
166 Constraint Foo();
168 Pattern {
169   // CHECK: unable to build a tuple with `Constraint` element
170   let tuple = (Foo);
171   erase op<>;
174 // -----
176 Constraint Foo(op: Op) {}
178 Pattern {
179   // CHECK: unable to negate non native constraints
180   let root = op<>;
181   not Foo(root);
184 // -----
186 Rewrite Foo();
188 Pattern {
189   // CHECK: unable to build a tuple with `Rewrite` element
190   let tuple = (Foo);
191   erase op<>;
194 // -----
196 Rewrite Foo(op: Op);
198 Pattern {
199   // CHECK: unable to negate a Rewrite
200   let root = op<>;
201   rewrite root with {
202      not Foo(root);
203   }
206 // -----
208 Pattern {
209   // CHECK: expected native constraint
210   not attr<"0 : i1">
211   erase _;
214 // -----
216 Pattern {
217   let tuple = (attr<"3 : i34">);
218   // CHECK: expected `(` after function name
219   not tuple.0;
220   erase _;
223 // -----
225 Pattern {
226   // CHECK: expected expression
227   let tuple = (10 = _: Value);
228   erase op<>;
231 // -----
233 Pattern {
234   // CHECK: duplicate tuple element label `field`
235   // CHECK: see previous label use here
236   let tuple = (field = _: Value, field = _: Value);
237   erase op<>;
240 // -----
242 //===----------------------------------------------------------------------===//
243 // `attr` Expr
244 //===----------------------------------------------------------------------===//
246 Pattern {
247   // CHECK: expected string literal containing MLIR attribute
248   let foo = attr<foo>;
251 // -----
253 Pattern {
254   // CHECK: expected `>` after attribute literal
255   let foo = attr<""<>;
258 // -----
260 //===----------------------------------------------------------------------===//
261 // `op` Expr
262 //===----------------------------------------------------------------------===//
264 Pattern {
265   // CHECK: expected `)` after operation operand list
266   let value: Value;
267   let foo = op<func.func>(value<;
270 // -----
272 Pattern {
273   // CHECK: unable to convert expression of type `Attr` to the expected type of `ValueRange`
274   let attr: Attr;
275   let foo = op<func.func>(attr);
278 // -----
280 Pattern {
281   // CHECK: expected `Value` or `ValueRange` convertible expression, but got `Type`
282   let foo = op<>(_: Type, _: TypeRange);
285 // -----
287 Pattern {
288   // CHECK: expected identifier or string attribute name
289   let foo = op<> { 10;
292 // -----
294 Pattern {
295   // CHECK: expected `Attr` expression, but got `Value`
296   let foo = op<> { foo = _: Value };
299 // -----
301 Pattern {
302   // CHECK: expected `}` after operation attribute list
303   let foo = op<> { "foo" {;
306 // -----
308 Pattern {
309   // CHECK: expected `(` before operation result type list
310   let foo = op<> -> );
313 // -----
315 Pattern {
316   // CHECK: unable to convert expression of type `ValueRange` to the expected type of `TypeRange`
317   let foo = op<> -> (_: ValueRange);
320 // -----
322 Pattern {
323   // CHECK: expected `Type` or `TypeRange` convertible expression, but got `Value`
324   let foo = op<> -> (_: Value, _: ValueRange);
327 // -----
329 Pattern {
330   // CHECK: expected `)` after operation result type list
331   let value: TypeRange;
332   let foo = op<> -> (value<;
335 // -----
337 #include "include/ops.td"
339 Pattern {
340   // CHECK: invalid number of operand groups for `test.all_empty`; expected 0, but got 2
341   // CHECK: see the definition of `test.all_empty` here
342   let foo = op<test.all_empty>(operand1: Value, operand2: Value);
345 // -----
347 #include "include/ops.td"
349 Pattern {
350   // CHECK: invalid number of result groups for `test.all_empty`; expected 0, but got 2
351   // CHECK: see the definition of `test.all_empty` here
352   let foo = op<test.all_empty> -> (result1: Type, result2: Type);
355 // -----
357 Pattern {
358   // CHECK: warning: operation result types are marked to be inferred, but
359   // CHECK-SAME: `test.unknown_inferred_result_op` is unknown.
360   // CHECK-SAME: Ensure that `test.unknown_inferred_result_op` supports zero
361   // CHECK-SAME: results or implements `InferTypeOpInterface`.
362   // CHECK-SAME: Include the ODS definition of this operation to remove this
363   // CHECK-SAME: warning.
364   rewrite _: Op with {
365     op<test.unknown_inferred_result_op>;
366   };
369 // -----
371 #include "include/ops.td"
373 Pattern {
374   // CHECK: warning: operation result types are marked to be inferred, but
375   // CHECK-SAME: `test.multiple_single_result` does not provide an implementation
376   // CHECK-SAME: of `InferTypeOpInterface`. Ensure that `test.multiple_single_result`
377   // CHECK-SAME: attaches `InferTypeOpInterface` at runtime, or add support
378   // CHECK-SAME: to the ODS definition to remove this warning.
379   // CHECK: see the definition of `test.multiple_single_result` here
380   rewrite _: Op with {
381     op<test.multiple_single_result>;
382   };
385 // -----
387 //===----------------------------------------------------------------------===//
388 // `type` Expr
389 //===----------------------------------------------------------------------===//
391 Pattern {
392   // CHECK: expected string literal containing MLIR type
393   let foo = type<foo;
396 // -----
398 Pattern {
399   // CHECK: expected `>` after type literal
400   let foo = type<"";