From c4c24a8093cb23d0ea359b4c2330ea154ca0a830 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Tue, 18 Dec 2018 00:03:36 +0000 Subject: [PATCH] [FileCheck] Annotate input dump (7/7) This patch implements annotations for diagnostics reporting CHECK-NOT failed matches. These diagnostics are enabled by -vv. As for diagnostics reporting failed matches for other directives, these annotations mark the search ranges using `X~~`. The difference here is that failed matches for CHECK-NOT are successes not errors, so they are green not red when colors are enabled. For example: ``` $ FileCheck -dump-input=help The following description was requested by -dump-input=help to explain the input annotations printed by -dump-input=always and -dump-input=fail: - L: labels line number L of the input file - T:L labels the only match result for a pattern of type T from line L of the check file - T:L'N labels the Nth match result for a pattern of type T from line L of the check file - ^~~ marks good match (reported if -v) - !~~ marks bad match, such as: - CHECK-NEXT on same line as previous match (error) - CHECK-NOT found (error) - CHECK-DAG overlapping match (discarded, reported if -vv) - X~~ marks search range when no match is found, such as: - CHECK-NEXT not found (error) - CHECK-NOT not found (success, reported if -vv) - CHECK-DAG not found after discarded matches (error) - ? marks fuzzy match when no match is found - colors success, error, fuzzy match, discarded match, unmatched input If you are not seeing color above or in input dumps, try: -color $ FileCheck -vv -dump-input=always check5 < input5 |& sed -n '/^<<<>>>>> $ cat check5 CHECK: abc CHECK-NOT: foobar CHECK: jkl CHECK-NOT: foobar $ cat input5 abcdef ghijkl mnopqr stuvwx ``` Reviewed By: george.karpenkov, probinson Differential Revision: https://reviews.llvm.org/D53899 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349424 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/FileCheck.h | 7 ++++--- lib/Support/FileCheck.cpp | 9 ++++----- test/FileCheck/dump-input-annotations.txt | 8 +++++++- utils/FileCheck/FileCheck.cpp | 5 +++-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/include/llvm/Support/FileCheck.h b/include/llvm/Support/FileCheck.h index c79e9cb683e..edc5424bd21 100644 --- a/include/llvm/Support/FileCheck.h +++ b/include/llvm/Support/FileCheck.h @@ -173,14 +173,15 @@ struct FileCheckDiag { MatchFinalButWrongLine, /// Indicates a discarded match for an expected pattern. MatchDiscard, + /// Indicates no match for an excluded pattern. + MatchNoneAndExcluded, /// Indicates no match for an expected pattern. MatchNoneButExpected, /// Indicates a possible intended match because there's no perfect match. MatchFuzzy, - MatchTypeCount, } MatchTy; - /// The match range if MatchTy is not MatchNoneButExpected, or the search - /// range otherwise. + /// The match range if MatchTy is not MatchNoneAndExcluded or + /// MatchNoneButExpected, or the search range otherwise. unsigned InputStartLine, InputStartCol, InputEndLine, InputEndCol; FileCheckDiag(const SourceMgr &SM, const Check::FileCheckType &CheckTy, SMLoc CheckLoc, MatchType MatchTy, SMRange InputRange); diff --git a/lib/Support/FileCheck.cpp b/lib/Support/FileCheck.cpp index 52da7e9865d..cf377bd92e2 100644 --- a/lib/Support/FileCheck.cpp +++ b/lib/Support/FileCheck.cpp @@ -421,9 +421,7 @@ static SMRange ProcessMatchResult(FileCheckDiag::MatchType MatchTy, SMLoc Start = SMLoc::getFromPointer(Buffer.data() + Pos); SMLoc End = SMLoc::getFromPointer(Buffer.data() + Pos + Len); SMRange Range(Start, End); - // TODO: The second condition will disappear when we extend this to handle - // more match types. - if (Diags && MatchTy != FileCheckDiag::MatchTypeCount) { + if (Diags) { if (AdjustPrevDiag) Diags->rbegin()->MatchTy = MatchTy; else @@ -962,12 +960,13 @@ static void PrintNoMatch(bool ExpectedMatch, const SourceMgr &SM, Buffer = Buffer.substr(Buffer.find_first_not_of(" \t\n\r")); SMRange SearchRange = ProcessMatchResult( ExpectedMatch ? FileCheckDiag::MatchNoneButExpected - : FileCheckDiag::MatchTypeCount, + : FileCheckDiag::MatchNoneAndExcluded, SM, Loc, Pat.getCheckTy(), Buffer, 0, Buffer.size(), Diags); SM.PrintMessage(SearchRange.Start, SourceMgr::DK_Note, "scanning from here"); // Allow the pattern to print additional information if desired. Pat.PrintVariableUses(SM, Buffer, VariableTable); + if (ExpectedMatch) Pat.PrintFuzzyMatch(SM, Buffer, VariableTable, Diags); } @@ -1176,7 +1175,7 @@ bool FileCheckString::CheckNot( if (Pos == StringRef::npos) { PrintNoMatch(false, SM, Prefix, Pat->getLoc(), *Pat, 1, Buffer, - VariableTable, Req.VerboseVerbose, nullptr); + VariableTable, Req.VerboseVerbose, Diags); continue; } diff --git a/test/FileCheck/dump-input-annotations.txt b/test/FileCheck/dump-input-annotations.txt index 20598809851..3dc7f908aa2 100644 --- a/test/FileCheck/dump-input-annotations.txt +++ b/test/FileCheck/dump-input-annotations.txt @@ -252,7 +252,7 @@ ; EMP2-NOT: {{.}} ;-------------------------------------------------- -; CHECK-NOT (also: EOF pattern) +; CHECK-NOT (also: EOF pattern, and multiline range that ends before EOL) ;-------------------------------------------------- ; No match (success) and unexpected match (error). @@ -273,9 +273,12 @@ ; NOT: <<<<<< ; NOT-NEXT: 1: hello +; NOT-VV-NEXT: not:1 X~~~~ ; NOT-NEXT: 2: world +; NOT-VV-NEXT: not:1 ~~~~~ ; NOT-NEXT: not:2 !~~~~ error: no match expected ; NOT-NEXT: 3: again +; NOT-VV-NEXT: not:1 ~~~~~ ; NOT-VV-NEXT: 4: ; NOT-VV-NEXT: eof:2 ^ ; NOT-NEXT: >>>>>> @@ -294,9 +297,12 @@ ; NOT2: <<<<<< ; NOT2-NEXT: 1: hello +; NOT2-VV-NEXT: not:1 X~~~~ ; NOT2-NEXT: 2: world +; NOT2-VV-NEXT: not:1 ~~~~~ ; NOT2-NEXT: not:2 !~~~~ error: no match expected ; NOT2-NEXT: 3: again +; NOT2-VV-NEXT: not:1 ~~ ; NOT2-V-NEXT: check:3 ^~~ ; NOT2-NEXT: >>>>>> ; NOT2-NOT: {{.}} diff --git a/utils/FileCheck/FileCheck.cpp b/utils/FileCheck/FileCheck.cpp index cde9bb95706..6f4cf31ec83 100644 --- a/utils/FileCheck/FileCheck.cpp +++ b/utils/FileCheck/FileCheck.cpp @@ -153,12 +153,12 @@ static MarkerStyle GetMarker(FileCheckDiag::MatchType MatchTy) { case FileCheckDiag::MatchDiscard: return MarkerStyle('!', raw_ostream::CYAN, "discard: overlaps earlier match"); + case FileCheckDiag::MatchNoneAndExcluded: + return MarkerStyle('X', raw_ostream::GREEN); case FileCheckDiag::MatchNoneButExpected: return MarkerStyle('X', raw_ostream::RED, "error: no match found"); case FileCheckDiag::MatchFuzzy: return MarkerStyle('?', raw_ostream::MAGENTA, "possible intended match"); - case FileCheckDiag::MatchTypeCount: - llvm_unreachable_internal("unexpected match type"); } llvm_unreachable_internal("unexpected match type"); } @@ -200,6 +200,7 @@ static void DumpInputAnnotationHelp(raw_ostream &OS) { WithColor(OS, raw_ostream::SAVEDCOLOR, true) << "X~~"; OS << " marks search range when no match is found, such as:\n" << " - CHECK-NEXT not found (error)\n" + << " - CHECK-NOT not found (success, reported if -vv)\n" << " - CHECK-DAG not found after discarded matches (error)\n" << " - "; WithColor(OS, raw_ostream::SAVEDCOLOR, true) << "?"; -- 2.50.1