// RUN: not mlir-pdll %s -I %S -I %S/../../../include -split-input-file 2>&1 | FileCheck %s // CHECK: expected top-level declaration, such as a `Pattern` 10 // ----- Pattern { // CHECK: expected `;` after statement erase _: Op } // ----- //===----------------------------------------------------------------------===// // `erase` //===----------------------------------------------------------------------===// Pattern { // CHECK: expected expression erase; } // ----- Pattern { // CHECK: expected `Op` expression erase _: Attr; } // ----- //===----------------------------------------------------------------------===// // `let` //===----------------------------------------------------------------------===// Pattern { // CHECK: expected identifier after `let` to name a new variable let 5; } // ----- Pattern { // CHECK: `_` may only be used to define "inline" variables let _; } // ----- Pattern { // CHECK: expected expression let foo: Attr<>; } // ----- Pattern { // CHECK: expected expression of `Type` in type constraint let foo: Attr<_: Attr>; } // ----- Pattern { // CHECK: expected `>` after variable type constraint let foo: Attr<_: Type{}; } // ----- Pattern { // CHECK: the type of this variable has already been constrained let foo: [Attr<_: Type>, Attr<_: Type]; } // ----- Pattern { // CHECK: expected `.` after dialect namespace let foo: Op; } // ----- Pattern { // CHECK: expected operation name after dialect namespace let foo: Op; } // ----- Pattern { // CHECK: expected `>` after operation name let foo: Op; } // ----- Pattern { // CHECK: expected expression of `Type` in type constraint let foo: Value<_: Attr>; } // ----- Pattern { // CHECK: expected `>` after variable type constraint let foo: Value<_: Type{}; } // ----- Pattern { // CHECK: the type of this variable has already been constrained let foo: [Value<_: Type>, Value<_: Type]; } // ----- Pattern { // CHECK: expected expression let foo: ValueRange<10>; } // ----- Pattern { // CHECK: expected expression of `TypeRange` in type constraint let foo: ValueRange<_: Type>; } // ----- Pattern { // CHECK: expected `>` after variable type constraint let foo: ValueRange<_: Type{}; } // ----- Pattern { // CHECK: the type of this variable has already been constrained let foo: [ValueRange<_: Type>, ValueRange<_: Type]; } // ----- Pattern { // CHECK: unknown reference to constraint `UnknownConstraint` let foo: UnknownConstraint; } // ----- Pattern Foo { erase root: Op; } Pattern { // CHECK: invalid reference to non-constraint let foo: Foo; } // ----- Pattern { // CHECK: constraint type `Attr` is incompatible with the previously inferred type `Value` let foo: [Value, Attr]; } // ----- Pattern { // CHECK: expected `]` after constraint list let foo: [Attr[]; } // ----- Pattern { // CHECK: expected expression let foo: Attr = ; } // ----- Pattern { // CHECK: type constraints are not permitted on variables with initializers let foo: ValueRange<_: Type> = _: Op; } // ----- Pattern { // CHECK: unable to infer type for variable `foo` // CHECK: note: the type of a variable must be inferable from the constraint list or the initializer let foo; } // ----- Pattern { // CHECK: unable to convert expression of type `Attr` to the expected type of `Value` let foo: Value = _: Attr; } // ----- Pattern { // CHECK: :7:7: error: `foo` has already been defined // CHECK: :6:7: note: see previous definition here let foo: Attr; let foo: Attr; } // ----- Constraint Foo(); Pattern { // CHECK: unable to define variable of `Constraint` type let foo = Foo; } // ----- Rewrite Foo(); Pattern { // CHECK: unable to define variable of `Rewrite` type let foo = Foo; } // ----- Constraint MultiConstraint(arg1: Value, arg2: Value); Pattern { // CHECK: `Constraint`s applied via a variable constraint list must take a single input, but got 2 let foo: MultiConstraint; } // ----- #include "include/ops.td" Pattern { // CHECK: unable to convert expression of type `Op` to the expected type of `Value` // CHECK: see the definition of `test.all_empty`, which was defined with zero results let value: Value = op; erase _: Op; } // ----- #include "include/ops.td" Pattern { // CHECK: unable to convert expression of type `Op` to the expected type of `Value` // CHECK: see the definition of `test.multiple_single_result`, which was defined with at least 2 results let value: Value = op; erase _: Op; } // ----- //===----------------------------------------------------------------------===// // `replace` //===----------------------------------------------------------------------===// Pattern { // CHECK: expected `Op` expression replace attr<""> with attr<"">; } // ----- Pattern { // CHECK: expected `with` after root operation replace op<>; } // ----- Pattern { // CHECK: expected `Op`, `Value` or `ValueRange` expression replace op<> with attr<"">; } // ----- Pattern { // CHECK: expected `Op`, `Value` or `ValueRange` expression replace op<> with (attr<"">); } // ----- Pattern { // CHECK: expected `)` after replacement values replace op<>(input: Value) with (input; } // ----- Pattern { // CHECK: expected at least one replacement value, consider using `erase` if no replacement values are desired replace op<>(input: Value) with (); } // ----- Pattern { // CHECK: expected dialect namespace replace op<>(input: Value) with op<>; } // ----- //===----------------------------------------------------------------------===// // `return` //===----------------------------------------------------------------------===// // CHECK: expected `;` after statement Constraint Foo(arg: Value) -> Value { return arg } // ----- //===----------------------------------------------------------------------===// // `rewrite` //===----------------------------------------------------------------------===// Pattern { // CHECK: expected `Op` expression rewrite attr<""> with { op; }; } // ----- Pattern { // CHECK: expected `with` before rewrite body rewrite op<>; } // ----- Pattern { // CHECK: expected `{` to start rewrite body rewrite op<> with; } // ----- Pattern { // CHECK: expected dialect namespace rewrite root: Op with { op<>; }; } // ----- Pattern { // CHECK: `return` statements are only permitted within a `Constraint` or `Rewrite` body rewrite root: Op with { return root; }; }