This commit moves FuncOp out of the builtin dialect, and into the Func dialect. This move has been planned in some capacity from the moment we made FuncOp an operation (years ago). This commit handles the functional aspects of the move, but various aspects are left untouched to ease migration: func::FuncOp is re-exported into mlir to reduce the actual API churn, the assembly format still accepts the unqualified `func`. These temporary measures will remain for a little while to simplify migration before being removed. Differential Revision: https://reviews.llvm.org/D121266
314 lines
6.0 KiB
Plaintext
314 lines
6.0 KiB
Plaintext
// RUN: not mlir-pdll %s -I %S -I %S/../../../include -split-input-file 2>&1 | FileCheck %s
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Reference Expr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Pattern {
|
|
// CHECK: expected identifier constraint
|
|
let foo = Foo: ;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: undefined reference to `bar`
|
|
let foo = bar;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern FooPattern {
|
|
erase _: Op;
|
|
}
|
|
|
|
Pattern {
|
|
// CHECK: invalid reference to `FooPattern`
|
|
let foo = FooPattern;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `:` after `_` variable
|
|
let foo = _;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected identifier constraint
|
|
let foo = _: ;
|
|
}
|
|
|
|
// -----
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Call Expr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Constraint foo(value: Value);
|
|
|
|
Pattern {
|
|
// CHECK: expected `)` after argument list
|
|
foo(_: Value{};
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected a reference to a callable `Constraint` or `Rewrite`, but got: `Op`
|
|
let foo: Op;
|
|
foo();
|
|
}
|
|
|
|
// -----
|
|
|
|
Constraint Foo();
|
|
|
|
Pattern {
|
|
// CHECK: invalid number of arguments for constraint call; expected 0, but got 1
|
|
Foo(_: Value);
|
|
}
|
|
|
|
// -----
|
|
|
|
Constraint Foo(arg: Value);
|
|
|
|
Pattern {
|
|
// CHECK: unable to convert expression of type `Attr` to the expected type of `Value`
|
|
Foo(attr<"i32">);
|
|
}
|
|
|
|
// -----
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Member Access Expr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Pattern {
|
|
// CHECK: expected identifier or numeric member name
|
|
let root: Op;
|
|
erase root.<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: invalid member access `unknown_result` on expression of type `Op`
|
|
let root: Op;
|
|
erase root.unknown_result;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
let tuple = (result1 = value: Value, result2 = value);
|
|
|
|
// CHECK: invalid member access `unknown_result` on expression of type `Tuple<result1: Value, result2: Value>`
|
|
let tuple2 = (tuple.result1, tuple.unknown_result);
|
|
|
|
erase op<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
let tuple = (result1 = value: Value, result2 = value);
|
|
|
|
// CHECK: invalid member access `2` on expression of type `Tuple<result1: Value, result2: Value>`
|
|
let tuple2 = (tuple.0, tuple.2);
|
|
|
|
erase op<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Tuple Expr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Pattern {
|
|
// CHECK: expected `)` after tuple element list
|
|
let tuple = (value: Value, value;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: unable to build a tuple with `Tuple<Value, Value>` element
|
|
let tuple = (_: Value, _: Value);
|
|
let var = (tuple);
|
|
erase op<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
Constraint Foo();
|
|
|
|
Pattern {
|
|
// CHECK: unable to build a tuple with `Constraint` element
|
|
let tuple = (Foo);
|
|
erase op<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
Rewrite Foo();
|
|
|
|
Pattern {
|
|
// CHECK: unable to build a tuple with `Rewrite` element
|
|
let tuple = (Foo);
|
|
erase op<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected expression
|
|
let tuple = (10 = _: Value);
|
|
erase op<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: duplicate tuple element label `field`
|
|
// CHECK: see previous label use here
|
|
let tuple = (field = _: Value, field = _: Value);
|
|
erase op<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// `attr` Expr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Pattern {
|
|
// CHECK: expected string literal containing MLIR attribute
|
|
let foo = attr<foo>;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `>` after attribute literal
|
|
let foo = attr<""<>;
|
|
}
|
|
|
|
// -----
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// `op` Expr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Pattern {
|
|
// CHECK: expected `)` after operation operand list
|
|
let value: Value;
|
|
let foo = op<func.func>(value<;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: unable to convert expression of type `Attr` to the expected type of `ValueRange`
|
|
let attr: Attr;
|
|
let foo = op<func.func>(attr);
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `Value` or `ValueRange` convertible expression, but got `Type`
|
|
let foo = op<>(_: Type, _: TypeRange);
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected identifier or string attribute name
|
|
let foo = op<> { 10;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `Attr` expression, but got `Value`
|
|
let foo = op<> { foo = _: Value };
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `}` after operation attribute list
|
|
let foo = op<> { "foo" {;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `(` before operation result type list
|
|
let foo = op<> -> );
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: unable to convert expression of type `ValueRange` to the expected type of `TypeRange`
|
|
let foo = op<> -> (_: ValueRange);
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `Type` or `TypeRange` convertible expression, but got `Value`
|
|
let foo = op<> -> (_: Value, _: ValueRange);
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `)` after operation result type list
|
|
let value: TypeRange;
|
|
let foo = op<> -> (value<;
|
|
}
|
|
|
|
// -----
|
|
|
|
#include "include/ops.td"
|
|
|
|
Pattern {
|
|
// CHECK: invalid number of operand groups for `test.all_empty`; expected 0, but got 2
|
|
// CHECK: see the definition of `test.all_empty` here
|
|
let foo = op<test.all_empty>(operand1: Value, operand2: Value);
|
|
}
|
|
|
|
// -----
|
|
|
|
#include "include/ops.td"
|
|
|
|
Pattern {
|
|
// CHECK: invalid number of result groups for `test.all_empty`; expected 0, but got 2
|
|
// CHECK: see the definition of `test.all_empty` here
|
|
let foo = op<test.all_empty> -> (result1: Type, result2: Type);
|
|
}
|
|
|
|
// -----
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// `type` Expr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Pattern {
|
|
// CHECK: expected string literal containing MLIR type
|
|
let foo = type<foo;
|
|
}
|
|
|
|
// -----
|
|
|
|
Pattern {
|
|
// CHECK: expected `>` after type literal
|
|
let foo = type<"";
|
|
}
|