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