xref: /llvm-project/mlir/test/mlir-pdll/Parser/expr-failure.pdll (revision 780a20984b6af067eed5870eb7c00ea076b6072a)
181f2f4dfSRiver Riddle// RUN: not mlir-pdll %s -I %S -I %S/../../../include -split-input-file 2>&1 | FileCheck %s
211d26bd1SRiver Riddle
311d26bd1SRiver Riddle//===----------------------------------------------------------------------===//
411d26bd1SRiver Riddle// Reference Expr
511d26bd1SRiver Riddle//===----------------------------------------------------------------------===//
611d26bd1SRiver Riddle
711d26bd1SRiver RiddlePattern {
811d26bd1SRiver Riddle  // CHECK: expected identifier constraint
911d26bd1SRiver Riddle  let foo = Foo: ;
1011d26bd1SRiver Riddle}
1111d26bd1SRiver Riddle
1211d26bd1SRiver Riddle// -----
1311d26bd1SRiver Riddle
1411d26bd1SRiver RiddlePattern {
1511d26bd1SRiver Riddle  // CHECK: undefined reference to `bar`
1611d26bd1SRiver Riddle  let foo = bar;
1711d26bd1SRiver Riddle}
1811d26bd1SRiver Riddle
1911d26bd1SRiver Riddle// -----
2011d26bd1SRiver Riddle
2111d26bd1SRiver RiddlePattern FooPattern {
2211d26bd1SRiver Riddle  erase _: Op;
2311d26bd1SRiver Riddle}
2411d26bd1SRiver Riddle
2511d26bd1SRiver RiddlePattern {
2611d26bd1SRiver Riddle  // CHECK: invalid reference to `FooPattern`
2711d26bd1SRiver Riddle  let foo = FooPattern;
2811d26bd1SRiver Riddle}
2911d26bd1SRiver Riddle
3011d26bd1SRiver Riddle// -----
3111d26bd1SRiver Riddle
3211d26bd1SRiver RiddlePattern {
3311d26bd1SRiver Riddle  // CHECK: expected `:` after `_` variable
3411d26bd1SRiver Riddle  let foo = _;
3511d26bd1SRiver Riddle}
3611d26bd1SRiver Riddle
3711d26bd1SRiver Riddle// -----
3811d26bd1SRiver Riddle
3911d26bd1SRiver RiddlePattern {
4011d26bd1SRiver Riddle  // CHECK: expected identifier constraint
4111d26bd1SRiver Riddle  let foo = _: ;
4211d26bd1SRiver Riddle}
4311d26bd1SRiver Riddle
4411d26bd1SRiver Riddle// -----
4511d26bd1SRiver Riddle
4611d26bd1SRiver Riddle//===----------------------------------------------------------------------===//
47faf42264SRiver Riddle// Call Expr
48faf42264SRiver Riddle//===----------------------------------------------------------------------===//
49faf42264SRiver Riddle
50faf42264SRiver RiddleConstraint foo(value: Value);
51faf42264SRiver Riddle
52faf42264SRiver RiddlePattern {
53faf42264SRiver Riddle  // CHECK: expected `)` after argument list
54faf42264SRiver Riddle  foo(_: Value{};
55faf42264SRiver Riddle}
56faf42264SRiver Riddle
57faf42264SRiver Riddle// -----
58faf42264SRiver Riddle
59faf42264SRiver RiddlePattern {
60faf42264SRiver Riddle  // CHECK: expected a reference to a callable `Constraint` or `Rewrite`, but got: `Op`
61faf42264SRiver Riddle  let foo: Op;
62faf42264SRiver Riddle  foo();
63faf42264SRiver Riddle}
64faf42264SRiver Riddle
65faf42264SRiver Riddle// -----
66faf42264SRiver Riddle
67faf42264SRiver RiddleConstraint Foo();
68faf42264SRiver Riddle
69faf42264SRiver RiddlePattern {
70faf42264SRiver Riddle  // CHECK: invalid number of arguments for constraint call; expected 0, but got 1
71faf42264SRiver Riddle  Foo(_: Value);
72faf42264SRiver Riddle}
73faf42264SRiver Riddle
74faf42264SRiver Riddle// -----
75faf42264SRiver Riddle
76faf42264SRiver RiddleConstraint Foo(arg: Value);
77faf42264SRiver Riddle
78faf42264SRiver RiddlePattern {
79faf42264SRiver Riddle  // CHECK: unable to convert expression of type `Attr` to the expected type of `Value`
80faf42264SRiver Riddle  Foo(attr<"i32">);
81faf42264SRiver Riddle}
82faf42264SRiver Riddle
83faf42264SRiver Riddle// -----
84faf42264SRiver Riddle
85faf42264SRiver Riddle//===----------------------------------------------------------------------===//
8611d26bd1SRiver Riddle// Member Access Expr
8711d26bd1SRiver Riddle//===----------------------------------------------------------------------===//
8811d26bd1SRiver Riddle
8911d26bd1SRiver RiddlePattern {
9011d26bd1SRiver Riddle  // CHECK: expected identifier or numeric member name
9111d26bd1SRiver Riddle  let root: Op;
9211d26bd1SRiver Riddle  erase root.<>;
9311d26bd1SRiver Riddle}
9411d26bd1SRiver Riddle
9511d26bd1SRiver Riddle// -----
9611d26bd1SRiver Riddle
9711d26bd1SRiver RiddlePattern {
9811d26bd1SRiver Riddle  // CHECK: invalid member access `unknown_result` on expression of type `Op`
9911d26bd1SRiver Riddle  let root: Op;
10011d26bd1SRiver Riddle  erase root.unknown_result;
10111d26bd1SRiver Riddle}
102d7e7fdf3SRiver Riddle
103d7e7fdf3SRiver Riddle// -----
104d7e7fdf3SRiver Riddle
105f62a57a3SRiver RiddlePattern {
106f62a57a3SRiver Riddle  let tuple = (result1 = value: Value, result2 = value);
107f62a57a3SRiver Riddle
108f62a57a3SRiver Riddle  // CHECK: invalid member access `unknown_result` on expression of type `Tuple<result1: Value, result2: Value>`
109f62a57a3SRiver Riddle  let tuple2 = (tuple.result1, tuple.unknown_result);
110f62a57a3SRiver Riddle
111f62a57a3SRiver Riddle  erase op<>;
112f62a57a3SRiver Riddle}
113f62a57a3SRiver Riddle
114f62a57a3SRiver Riddle// -----
115f62a57a3SRiver Riddle
116f62a57a3SRiver RiddlePattern {
117f62a57a3SRiver Riddle  let tuple = (result1 = value: Value, result2 = value);
118f62a57a3SRiver Riddle
119f62a57a3SRiver Riddle  // CHECK: invalid member access `2` on expression of type `Tuple<result1: Value, result2: Value>`
120f62a57a3SRiver Riddle  let tuple2 = (tuple.0, tuple.2);
121f62a57a3SRiver Riddle
122f62a57a3SRiver Riddle  erase op<>;
123f62a57a3SRiver Riddle}
124f62a57a3SRiver Riddle
125f62a57a3SRiver Riddle// -----
126f62a57a3SRiver Riddle
127f62a57a3SRiver Riddle//===----------------------------------------------------------------------===//
1289e57210aSRiver Riddle// Range Expr
1299e57210aSRiver Riddle//===----------------------------------------------------------------------===//
1309e57210aSRiver Riddle
1319e57210aSRiver RiddlePattern {
1329e57210aSRiver Riddle  // CHECK: unable to convert expression of type `Tuple<>` to the expected type of `ValueRange`
1339e57210aSRiver Riddle  // CHECK: Tuple to Range conversion is currently only allowed within a rewrite context
1349e57210aSRiver Riddle  erase op<>(());
1359e57210aSRiver Riddle}
1369e57210aSRiver Riddle
1379e57210aSRiver Riddle// -----
1389e57210aSRiver Riddle
1399e57210aSRiver RiddlePattern {
1409e57210aSRiver Riddle  // CHECK: unable to convert expression of type `Tuple<Value, Type>` to the expected type of `ValueRange`
1419e57210aSRiver Riddle  replace op<>(arg: Value) -> (type: Type) with op<test.op>((arg, type));
1429e57210aSRiver Riddle}
1439e57210aSRiver Riddle
1449e57210aSRiver Riddle// -----
1459e57210aSRiver Riddle
1469e57210aSRiver Riddle//===----------------------------------------------------------------------===//
147f62a57a3SRiver Riddle// Tuple Expr
148f62a57a3SRiver Riddle//===----------------------------------------------------------------------===//
149f62a57a3SRiver Riddle
150f62a57a3SRiver RiddlePattern {
151f62a57a3SRiver Riddle  // CHECK: expected `)` after tuple element list
152f62a57a3SRiver Riddle  let tuple = (value: Value, value;
153f62a57a3SRiver Riddle}
154f62a57a3SRiver Riddle
155f62a57a3SRiver Riddle// -----
156f62a57a3SRiver Riddle
157f62a57a3SRiver RiddlePattern {
158f62a57a3SRiver Riddle  // CHECK: unable to build a tuple with `Tuple<Value, Value>` element
159f62a57a3SRiver Riddle  let tuple = (_: Value, _: Value);
160f62a57a3SRiver Riddle  let var = (tuple);
161f62a57a3SRiver Riddle  erase op<>;
162f62a57a3SRiver Riddle}
163f62a57a3SRiver Riddle
164f62a57a3SRiver Riddle// -----
165f62a57a3SRiver Riddle
166faf42264SRiver RiddleConstraint Foo();
167faf42264SRiver Riddle
168faf42264SRiver RiddlePattern {
169faf42264SRiver Riddle  // CHECK: unable to build a tuple with `Constraint` element
170faf42264SRiver Riddle  let tuple = (Foo);
171faf42264SRiver Riddle  erase op<>;
172faf42264SRiver Riddle}
173faf42264SRiver Riddle
174faf42264SRiver Riddle// -----
175faf42264SRiver Riddle
176930916c7SMogballConstraint Foo(op: Op) {}
177930916c7SMogball
178930916c7SMogballPattern {
179930916c7SMogball  // CHECK: unable to negate non native constraints
180930916c7SMogball  let root = op<>;
181930916c7SMogball  not Foo(root);
182930916c7SMogball}
183930916c7SMogball
184930916c7SMogball// -----
185930916c7SMogball
186faf42264SRiver RiddleRewrite Foo();
187faf42264SRiver Riddle
188faf42264SRiver RiddlePattern {
189faf42264SRiver Riddle  // CHECK: unable to build a tuple with `Rewrite` element
190faf42264SRiver Riddle  let tuple = (Foo);
191faf42264SRiver Riddle  erase op<>;
192faf42264SRiver Riddle}
193faf42264SRiver Riddle
194faf42264SRiver Riddle// -----
195faf42264SRiver Riddle
196930916c7SMogballRewrite Foo(op: Op);
197930916c7SMogball
198930916c7SMogballPattern {
199930916c7SMogball  // CHECK: unable to negate a Rewrite
200930916c7SMogball  let root = op<>;
201930916c7SMogball  rewrite root with {
202930916c7SMogball     not Foo(root);
203930916c7SMogball  }
204930916c7SMogball}
205930916c7SMogball
206930916c7SMogball// -----
207930916c7SMogball
208f62a57a3SRiver RiddlePattern {
209*780a2098SMatthias Gehre  // CHECK: expected native constraint
210*780a2098SMatthias Gehre  not attr<"0 : i1">
211*780a2098SMatthias Gehre  erase _;
212*780a2098SMatthias Gehre}
213*780a2098SMatthias Gehre
214*780a2098SMatthias Gehre// -----
215*780a2098SMatthias Gehre
216*780a2098SMatthias GehrePattern {
217*780a2098SMatthias Gehre  let tuple = (attr<"3 : i34">);
218*780a2098SMatthias Gehre  // CHECK: expected `(` after function name
219*780a2098SMatthias Gehre  not tuple.0;
220*780a2098SMatthias Gehre  erase _;
221*780a2098SMatthias Gehre}
222*780a2098SMatthias Gehre
223*780a2098SMatthias Gehre// -----
224*780a2098SMatthias Gehre
225*780a2098SMatthias GehrePattern {
226f62a57a3SRiver Riddle  // CHECK: expected expression
227f62a57a3SRiver Riddle  let tuple = (10 = _: Value);
228f62a57a3SRiver Riddle  erase op<>;
229f62a57a3SRiver Riddle}
230f62a57a3SRiver Riddle
231f62a57a3SRiver Riddle// -----
232f62a57a3SRiver Riddle
233f62a57a3SRiver RiddlePattern {
234f62a57a3SRiver Riddle  // CHECK: duplicate tuple element label `field`
235f62a57a3SRiver Riddle  // CHECK: see previous label use here
236f62a57a3SRiver Riddle  let tuple = (field = _: Value, field = _: Value);
237f62a57a3SRiver Riddle  erase op<>;
238f62a57a3SRiver Riddle}
239f62a57a3SRiver Riddle
240f62a57a3SRiver Riddle// -----
241f62a57a3SRiver Riddle
242d7e7fdf3SRiver Riddle//===----------------------------------------------------------------------===//
243d7e7fdf3SRiver Riddle// `attr` Expr
244d7e7fdf3SRiver Riddle//===----------------------------------------------------------------------===//
245d7e7fdf3SRiver Riddle
246d7e7fdf3SRiver RiddlePattern {
247d7e7fdf3SRiver Riddle  // CHECK: expected string literal containing MLIR attribute
248d7e7fdf3SRiver Riddle  let foo = attr<foo>;
249d7e7fdf3SRiver Riddle}
250d7e7fdf3SRiver Riddle
251d7e7fdf3SRiver Riddle// -----
252d7e7fdf3SRiver Riddle
253d7e7fdf3SRiver RiddlePattern {
254d7e7fdf3SRiver Riddle  // CHECK: expected `>` after attribute literal
255d7e7fdf3SRiver Riddle  let foo = attr<""<>;
256d7e7fdf3SRiver Riddle}
257d7e7fdf3SRiver Riddle
258d7e7fdf3SRiver Riddle// -----
259d7e7fdf3SRiver Riddle
260d7e7fdf3SRiver Riddle//===----------------------------------------------------------------------===//
26102670c3fSRiver Riddle// `op` Expr
26202670c3fSRiver Riddle//===----------------------------------------------------------------------===//
26302670c3fSRiver Riddle
26402670c3fSRiver RiddlePattern {
26502670c3fSRiver Riddle  // CHECK: expected `)` after operation operand list
26602670c3fSRiver Riddle  let value: Value;
26736550692SRiver Riddle  let foo = op<func.func>(value<;
26802670c3fSRiver Riddle}
26902670c3fSRiver Riddle
27002670c3fSRiver Riddle// -----
27102670c3fSRiver Riddle
27202670c3fSRiver RiddlePattern {
27302670c3fSRiver Riddle  // CHECK: unable to convert expression of type `Attr` to the expected type of `ValueRange`
27402670c3fSRiver Riddle  let attr: Attr;
27536550692SRiver Riddle  let foo = op<func.func>(attr);
27602670c3fSRiver Riddle}
27702670c3fSRiver Riddle
27802670c3fSRiver Riddle// -----
27902670c3fSRiver Riddle
28002670c3fSRiver RiddlePattern {
28102670c3fSRiver Riddle  // CHECK: expected `Value` or `ValueRange` convertible expression, but got `Type`
28202670c3fSRiver Riddle  let foo = op<>(_: Type, _: TypeRange);
28302670c3fSRiver Riddle}
28402670c3fSRiver Riddle
28502670c3fSRiver Riddle// -----
28602670c3fSRiver Riddle
28702670c3fSRiver RiddlePattern {
28802670c3fSRiver Riddle  // CHECK: expected identifier or string attribute name
28902670c3fSRiver Riddle  let foo = op<> { 10;
29002670c3fSRiver Riddle}
29102670c3fSRiver Riddle
29202670c3fSRiver Riddle// -----
29302670c3fSRiver Riddle
29402670c3fSRiver RiddlePattern {
29502670c3fSRiver Riddle  // CHECK: expected `Attr` expression, but got `Value`
29602670c3fSRiver Riddle  let foo = op<> { foo = _: Value };
29702670c3fSRiver Riddle}
29802670c3fSRiver Riddle
29902670c3fSRiver Riddle// -----
30002670c3fSRiver Riddle
30102670c3fSRiver RiddlePattern {
30202670c3fSRiver Riddle  // CHECK: expected `}` after operation attribute list
30302670c3fSRiver Riddle  let foo = op<> { "foo" {;
30402670c3fSRiver Riddle}
30502670c3fSRiver Riddle
30602670c3fSRiver Riddle// -----
30702670c3fSRiver Riddle
30802670c3fSRiver RiddlePattern {
30902670c3fSRiver Riddle  // CHECK: expected `(` before operation result type list
31002670c3fSRiver Riddle  let foo = op<> -> );
31102670c3fSRiver Riddle}
31202670c3fSRiver Riddle
31302670c3fSRiver Riddle// -----
31402670c3fSRiver Riddle
31502670c3fSRiver RiddlePattern {
31602670c3fSRiver Riddle  // CHECK: unable to convert expression of type `ValueRange` to the expected type of `TypeRange`
31702670c3fSRiver Riddle  let foo = op<> -> (_: ValueRange);
31802670c3fSRiver Riddle}
31902670c3fSRiver Riddle
32002670c3fSRiver Riddle// -----
32102670c3fSRiver Riddle
32202670c3fSRiver RiddlePattern {
32302670c3fSRiver Riddle  // CHECK: expected `Type` or `TypeRange` convertible expression, but got `Value`
32402670c3fSRiver Riddle  let foo = op<> -> (_: Value, _: ValueRange);
32502670c3fSRiver Riddle}
32602670c3fSRiver Riddle
32702670c3fSRiver Riddle// -----
32802670c3fSRiver Riddle
32902670c3fSRiver RiddlePattern {
33002670c3fSRiver Riddle  // CHECK: expected `)` after operation result type list
33102670c3fSRiver Riddle  let value: TypeRange;
33202670c3fSRiver Riddle  let foo = op<> -> (value<;
33302670c3fSRiver Riddle}
33402670c3fSRiver Riddle
33502670c3fSRiver Riddle// -----
33602670c3fSRiver Riddle
33781f2f4dfSRiver Riddle#include "include/ops.td"
33881f2f4dfSRiver Riddle
33981f2f4dfSRiver RiddlePattern {
34081f2f4dfSRiver Riddle  // CHECK: invalid number of operand groups for `test.all_empty`; expected 0, but got 2
34181f2f4dfSRiver Riddle  // CHECK: see the definition of `test.all_empty` here
34281f2f4dfSRiver Riddle  let foo = op<test.all_empty>(operand1: Value, operand2: Value);
34381f2f4dfSRiver Riddle}
34481f2f4dfSRiver Riddle
34581f2f4dfSRiver Riddle// -----
34681f2f4dfSRiver Riddle
34781f2f4dfSRiver Riddle#include "include/ops.td"
34881f2f4dfSRiver Riddle
34981f2f4dfSRiver RiddlePattern {
35081f2f4dfSRiver Riddle  // CHECK: invalid number of result groups for `test.all_empty`; expected 0, but got 2
35181f2f4dfSRiver Riddle  // CHECK: see the definition of `test.all_empty` here
35281f2f4dfSRiver Riddle  let foo = op<test.all_empty> -> (result1: Type, result2: Type);
35381f2f4dfSRiver Riddle}
35481f2f4dfSRiver Riddle
35581f2f4dfSRiver Riddle// -----
35681f2f4dfSRiver Riddle
35791b8d96fSRiver RiddlePattern {
35891b8d96fSRiver Riddle  // CHECK: warning: operation result types are marked to be inferred, but
35991b8d96fSRiver Riddle  // CHECK-SAME: `test.unknown_inferred_result_op` is unknown.
36091b8d96fSRiver Riddle  // CHECK-SAME: Ensure that `test.unknown_inferred_result_op` supports zero
36191b8d96fSRiver Riddle  // CHECK-SAME: results or implements `InferTypeOpInterface`.
36291b8d96fSRiver Riddle  // CHECK-SAME: Include the ODS definition of this operation to remove this
36391b8d96fSRiver Riddle  // CHECK-SAME: warning.
36491b8d96fSRiver Riddle  rewrite _: Op with {
36591b8d96fSRiver Riddle    op<test.unknown_inferred_result_op>;
36691b8d96fSRiver Riddle  };
36791b8d96fSRiver Riddle}
36891b8d96fSRiver Riddle
36991b8d96fSRiver Riddle// -----
37091b8d96fSRiver Riddle
37191b8d96fSRiver Riddle#include "include/ops.td"
37291b8d96fSRiver Riddle
37391b8d96fSRiver RiddlePattern {
37491b8d96fSRiver Riddle  // CHECK: warning: operation result types are marked to be inferred, but
37591b8d96fSRiver Riddle  // CHECK-SAME: `test.multiple_single_result` does not provide an implementation
37691b8d96fSRiver Riddle  // CHECK-SAME: of `InferTypeOpInterface`. Ensure that `test.multiple_single_result`
37791b8d96fSRiver Riddle  // CHECK-SAME: attaches `InferTypeOpInterface` at runtime, or add support
37891b8d96fSRiver Riddle  // CHECK-SAME: to the ODS definition to remove this warning.
37991b8d96fSRiver Riddle  // CHECK: see the definition of `test.multiple_single_result` here
38091b8d96fSRiver Riddle  rewrite _: Op with {
38191b8d96fSRiver Riddle    op<test.multiple_single_result>;
38291b8d96fSRiver Riddle  };
38391b8d96fSRiver Riddle}
38491b8d96fSRiver Riddle
38591b8d96fSRiver Riddle// -----
38691b8d96fSRiver Riddle
38702670c3fSRiver Riddle//===----------------------------------------------------------------------===//
388d7e7fdf3SRiver Riddle// `type` Expr
389d7e7fdf3SRiver Riddle//===----------------------------------------------------------------------===//
390d7e7fdf3SRiver Riddle
391d7e7fdf3SRiver RiddlePattern {
392d7e7fdf3SRiver Riddle  // CHECK: expected string literal containing MLIR type
393d7e7fdf3SRiver Riddle  let foo = type<foo;
394d7e7fdf3SRiver Riddle}
395d7e7fdf3SRiver Riddle
396d7e7fdf3SRiver Riddle// -----
397d7e7fdf3SRiver Riddle
398d7e7fdf3SRiver RiddlePattern {
399d7e7fdf3SRiver Riddle  // CHECK: expected `>` after type literal
400d7e7fdf3SRiver Riddle  let foo = type<"";
401d7e7fdf3SRiver Riddle}
402