1//===- TestDiagnosticsMetadata.cpp - Test Diagnostic Metatdata ------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains test passes for constructing and resolving dominance
10// information.
11//
12//===----------------------------------------------------------------------===//
13
14#include "mlir/IR/SymbolTable.h"
15#include "mlir/Pass/Pass.h"
16#include "llvm/Support/SourceMgr.h"
17
18using namespace mlir;
19
20namespace {
21struct TestDiagnosticMetadataPass
22 : public PassWrapper<TestDiagnosticMetadataPass,
23 InterfacePass<SymbolOpInterface>> {
24 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestDiagnosticMetadataPass)
25
26 StringRef getArgument() const final { return "test-diagnostic-metadata"; }
27 StringRef getDescription() const final { return "Test diagnostic metadata."; }
28 TestDiagnosticMetadataPass() = default;
29 TestDiagnosticMetadataPass(const TestDiagnosticMetadataPass &) {}
30
31 void runOnOperation() override {
32 llvm::errs() << "Test '" << getOperation().getName() << "'\n";
33
34 // Build a diagnostic handler that has filtering capabilities.
35 ScopedDiagnosticHandler handler(&getContext(), [](mlir::Diagnostic &diag) {
36 return mlir::success(
37 IsSuccess: llvm::none_of(Range&: diag.getMetadata(), P: [](mlir::DiagnosticArgument &arg) {
38 return arg.getKind() == mlir::DiagnosticArgument::
39 DiagnosticArgumentKind::String &&
40 arg.getAsString().contains(Other: "hello");
41 }));
42 });
43
44 // Emit a diagnostic for every operation with a valid loc.
45 getOperation()->walk([&](Operation *op) {
46 if (StringAttr strAttr = op->getAttrOfType<StringAttr>("attr")) {
47 if (strAttr.getValue() == "emit_error")
48 emitError(loc: op->getLoc(), message: "test diagnostic metadata")
49 .getUnderlyingDiagnostic()
50 ->getMetadata()
51 .push_back(Elt: DiagnosticArgument("hello"));
52 }
53 });
54 }
55};
56
57} // namespace
58
59namespace mlir {
60namespace test {
61void registerTestDiagnosticsMetadataPass() {
62 PassRegistration<TestDiagnosticMetadataPass>{};
63}
64} // namespace test
65} // namespace mlir
66

source code of mlir/test/lib/IR/TestDiagnosticsMetadata.cpp