//===- DiagnosedSilenceableFailure.h - Tri-state result ----------- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file declares the DiagnosedSilenceableFailure class allowing to store // a tri-state result (definite failure, recoverable failure, success) with an // optional associated list of diagnostics. // //===----------------------------------------------------------------------===// #include "mlir/IR/Diagnostics.h" #include "mlir/IR/Operation.h" #include <optional> #ifndef MLIR_DIALECT_TRANSFORM_UTILS_DIAGNOSEDSILENCEABLEFAILURE_H #define MLIR_DIALECT_TRANSFORM_UTILS_DIAGNOSEDSILENCEABLEFAILURE_H namespace mlir { /// The result of a transform IR operation application. This can have one of the /// three states: /// - success; /// - silenceable (recoverable) failure with yet-unreported diagnostic; /// - definite failure. /// Silenceable failure is intended to communicate information about /// transformations that did not apply but in a way that supports recovery, /// for example, they did not modify the payload IR or modified it in some /// predictable way. They are associated with a Diagnostic that provides more /// details on the failure. Silenceable failure can be discarded, turning the /// result into success, or "reported", emitting the diagnostic and turning the /// result into definite failure. /// Transform IR operations containing other operations are allowed to do either /// with the results of the nested transformations, but must propagate definite /// failures as their diagnostics have been already reported to the user. class [[nodiscard]] DiagnosedSilenceableFailure { … }; class DiagnosedDefiniteFailure; DiagnosedDefiniteFailure emitDefiniteFailure(Location loc, const Twine &message = {}); /// A compatibility class connecting `InFlightDiagnostic` to /// `DiagnosedSilenceableFailure` while providing an interface similar to the /// former. Implicitly convertible to `DiagnosticSilenceableFailure` in definite /// failure state and to `LogicalResult` failure. Reports the error on /// conversion or on destruction. Instances of this class can be created by /// `emitDefiniteFailure()`. class DiagnosedDefiniteFailure { … }; /// Emits a definite failure with the given message. The returned object allows /// for last-minute modification to the error message, such as attaching notes /// and completing the message. It will be reported when the object is /// destructed or converted. inline DiagnosedDefiniteFailure emitDefiniteFailure(Location loc, const Twine &message) { … } inline DiagnosedDefiniteFailure emitDefiniteFailure(Operation *op, const Twine &message = { … } /// Emits a silenceable failure with the given message. A silenceable failure /// must be either suppressed or converted into a definite failure and reported /// to the user. inline DiagnosedSilenceableFailure emitSilenceableFailure(Location loc, const Twine &message = { … } inline DiagnosedSilenceableFailure emitSilenceableFailure(Operation *op, const Twine &message = { … } } // namespace mlir #endif // MLIR_DIALECT_TRANSFORM_UTILS_DIAGNOSEDSILENCEABLEFAILURE_H