https://github.com/arichardson updated https://github.com/llvm/llvm-project/pull/227568
>From 4288d4c617a1e795794c601a400371a2f2865083 Mon Sep 17 00:00:00 2001 From: Alex Richardson <[email protected]> Date: Tue, 20 Oct 2026 14:56:04 -0700 Subject: [PATCH] [nspr] initial commit --- .../Support/SourceMgrDiagnosticVerifier.h | 11 +++-- .../Support/SourceMgrDiagnosticVerifier.cpp | 46 +++++++++++++------ .../SourceMgrDiagnosticVerifierTest.cpp | 20 ++++++++ 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/llvm/include/llvm/Support/SourceMgrDiagnosticVerifier.h b/llvm/include/llvm/Support/SourceMgrDiagnosticVerifier.h index b4a6867ba7f57..bcd1426e9548f 100644 --- a/llvm/include/llvm/Support/SourceMgrDiagnosticVerifier.h +++ b/llvm/include/llvm/Support/SourceMgrDiagnosticVerifier.h @@ -64,7 +64,11 @@ class LLVM_ABI SourceMgrDiagnosticVerifier { /// diagnostic is reported in them. Verifier errors (near misses, unmatched /// expected diagnostics, malformed directives) are printed to \p os, /// bypassing \p mgr's diagnostic handler. - SourceMgrDiagnosticVerifier(const SourceMgr &mgr, raw_ostream &os); + /// + /// \p prefixes are the directive prefixes to recognize (e.g. "expected" + /// for 'expected-error'); they must be non-empty. + SourceMgrDiagnosticVerifier(const SourceMgr &mgr, raw_ostream &os, + ArrayRef<StringRef> prefixes = {"expected"}); /// Matches a diagnostic against the expected diagnostics for \p loc, or /// against the '@unknown' expected diagnostics if \p loc is std::nullopt. @@ -127,9 +131,8 @@ class LLVM_ABI SourceMgrDiagnosticVerifier { const SourceMgr &mgr; raw_ostream &os; - /// Regex used to recognize 'expected-<kind>' comments. - Regex expected{"expected-(error|note|remark|warning)(-re)? " - "*(@([+-][0-9]+|above|below|unknown))? *{{(.*)}}$"}; + /// Regex used to recognize '<prefix>-<kind>' comments. + Regex expected; /// The expected diagnostics for each buffer that has been scanned so far, /// keyed by buffer identifier (i.e. file name). diff --git a/llvm/lib/Support/SourceMgrDiagnosticVerifier.cpp b/llvm/lib/Support/SourceMgrDiagnosticVerifier.cpp index cae1b3be6b0e1..fac95397e9ecb 100644 --- a/llvm/lib/Support/SourceMgrDiagnosticVerifier.cpp +++ b/llvm/lib/Support/SourceMgrDiagnosticVerifier.cpp @@ -7,14 +7,28 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/SourceMgrDiagnosticVerifier.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; -SourceMgrDiagnosticVerifier::SourceMgrDiagnosticVerifier(const SourceMgr &mgr, - raw_ostream &os) +SourceMgrDiagnosticVerifier::SourceMgrDiagnosticVerifier( + const SourceMgr &mgr, raw_ostream &os, ArrayRef<StringRef> prefixes) : mgr(mgr), os(os) { + assert(!prefixes.empty() && "must have at least one prefix"); + std::string prefixAlt; + raw_string_ostream prefixOs(prefixAlt); + ListSeparator sep("|"); + for (StringRef prefix : prefixes) { + assert(!prefix.empty() && "prefixes must be non-empty"); + prefixOs << sep << Regex::escape(prefix); + } + // Don't match 'expected' inside a longer word such as 'unexpected'. + expected = Regex("(^|[^[:alnum:]_-])(" + prefixAlt + + ")-(error|note|remark|warning)(-re)?" + " *(@([+-][0-9]+|above|below|unknown))? *{{(.*)}}$"); + for (unsigned i = 0, e = mgr.getNumBuffers(); i != e; ++i) (void)computeExpectedDiags(mgr.getMemoryBuffer(i + 1)); } @@ -107,12 +121,16 @@ SourceMgrDiagnosticVerifier::computeExpectedDiags(const MemoryBuffer *buf) { // The indices of designators that apply to the next non designator line. SmallVector<unsigned, 1> designatorsForNextLine; - // Scan the file for expected-* designators. + // Scan the file for <prefix>-* designators. SmallVector<StringRef, 100> lines; buf->getBuffer().split(lines, '\n'); for (unsigned lineNo = 0, e = lines.size(); lineNo < e; ++lineNo) { - SmallVector<StringRef, 4> matches; - if (!expected.match(lines[lineNo].rtrim(), &matches)) { + StringRef line = lines[lineNo].rtrim(); + + // Every directive contains '{{'; check that first to avoid running the + // regex on most lines. + SmallVector<StringRef, 8> matches; + if (!line.contains("{{") || !expected.match(line, &matches)) { // Check for designators that apply to this line. if (!designatorsForNextLine.empty()) { for (unsigned diagIndex : designatorsForNextLine) @@ -123,27 +141,27 @@ SourceMgrDiagnosticVerifier::computeExpectedDiags(const MemoryBuffer *buf) { continue; } - // Point to the start of expected-*. - SMLoc expectedStart = SMLoc::getFromPointer(matches[0].data()); + // Point to the start of <prefix>-*. + SMLoc expectedStart = SMLoc::getFromPointer(matches[2].data()); SourceMgr::DiagKind kind; - if (matches[1] == "error") + if (matches[3] == "error") kind = SourceMgr::DK_Error; - else if (matches[1] == "warning") + else if (matches[3] == "warning") kind = SourceMgr::DK_Warning; - else if (matches[1] == "remark") + else if (matches[3] == "remark") kind = SourceMgr::DK_Remark; else { - assert(matches[1] == "note"); + assert(matches[3] == "note"); kind = SourceMgr::DK_Note; } - ExpectedDiag record(kind, lineNo + 1, expectedStart, matches[5]); + ExpectedDiag record(kind, lineNo + 1, expectedStart, matches[7]); // Check to see if this is a regex match, i.e. it includes the `-re`. - if (!matches[2].empty() && !computeRegex(record)) + if (!matches[4].empty() && !computeRegex(record)) continue; - StringRef offsetMatch = matches[3]; + StringRef offsetMatch = matches[5]; if (!offsetMatch.empty()) { offsetMatch = offsetMatch.drop_front(1); diff --git a/llvm/unittests/Support/SourceMgrDiagnosticVerifierTest.cpp b/llvm/unittests/Support/SourceMgrDiagnosticVerifierTest.cpp index 5f731293a5c50..19beb0fd98988 100644 --- a/llvm/unittests/Support/SourceMgrDiagnosticVerifierTest.cpp +++ b/llvm/unittests/Support/SourceMgrDiagnosticVerifierTest.cpp @@ -121,3 +121,23 @@ TEST_F(SourceMgrDiagnosticVerifierTest, InstalledAsDiagHandler) { StringRef::npos); EXPECT_FALSE(Verifier.verify()); } + +TEST_F(SourceMgrDiagnosticVerifierTest, CustomPrefixes) { + const MemoryBuffer *Buf = + addBuffer("op\n" + "// check-error@-1 {{first prefix}}\n" + "# alt-warning@-2 {{second prefix}}\n" + "// uncheck-error@-3 {{longer prefix ignored}}\n" + "// other-check-error@-4 {{hyphenated prefix ignored}}\n" + "// expected-error@-5 {{default prefix ignored}}\n"); + SourceMgrDiagnosticVerifier Verifier(SM, OS, {"check", "alt"}); + + EXPECT_EQ( + Verifier.process(getMessage(Buf, SourceMgr::DK_Error, "first prefix")), + MatchResult::Matched); + EXPECT_EQ( + Verifier.process(getMessage(Buf, SourceMgr::DK_Warning, "second prefix")), + MatchResult::Matched); + EXPECT_TRUE(Verifier.verify()); + EXPECT_EQ(Output, ""); +} _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
