diff --git a/mlir/lib/Dialect/Transform/IR/TransformOps.cpp b/mlir/lib/Dialect/Transform/IR/TransformOps.cpp --- a/mlir/lib/Dialect/Transform/IR/TransformOps.cpp +++ b/mlir/lib/Dialect/Transform/IR/TransformOps.cpp @@ -1009,6 +1009,17 @@ return diag; } + if (!topLevelOp) { + if (auto *parentOp = getOperation()->getParentOp()) { + if (!parentOp->hasTrait< + ::mlir::transform::PossibleTopLevelTransformOpTrait>()) { + InFlightDiagnostic diag = emitOpError() + << "expects at least one non-pattern op"; + return diag; + } + } + } + if (auto parent = getOperation()->getParentOfType()) { InFlightDiagnostic diag = emitOpError() << "cannot be nested"; diag.attachNote(parent.getLoc()) << "parent operation"; diff --git a/mlir/test/Dialect/Transform/ops-invalid.mlir b/mlir/test/Dialect/Transform/ops-invalid.mlir --- a/mlir/test/Dialect/Transform/ops-invalid.mlir +++ b/mlir/test/Dialect/Transform/ops-invalid.mlir @@ -126,6 +126,17 @@ // ----- +// expected-error @below {{op expects at least one non-pattern op}} +transform.with_pdl_patterns { +^bb0(%arg0: !pdl.operation): + pdl.pattern @some : benefit(1) { + %0 = pdl.operation "test.foo" + pdl.rewrite %0 with "transform.dialect" + } +} + +// ----- + // expected-error @below {{expects at least one region}} "transform.test_transform_unrestricted_op_no_interface"() : () -> ()