Index: llvm/include/llvm/Support/FileCheck.h =================================================================== --- llvm/include/llvm/Support/FileCheck.h +++ llvm/include/llvm/Support/FileCheck.h @@ -161,12 +161,14 @@ /// What kind of match result does this diagnostic describe? /// /// There might be more than one of these for the same directive. For - /// example, there might be a fuzzy match after a fail. + /// example, there might be several discards before either a final or fail, + /// and there might be a fuzzy match after a fail. enum MatchType { // TODO: More members will appear with later patches in this series. MatchFinalAndExpected, //< the final match for an expected pattern MatchFinalButExcluded, //< the final match for an excluded pattern MatchFinalButIllegal, //< the final but illegal match for an expected pattern + MatchDiscard, //< a discarded match for an expected pattern MatchNoneButExpected, //< no match for an expected pattern MatchFuzzy, //< a fuzzy match (because no perfect match) MatchTypeCount, Index: llvm/lib/Support/FileCheck.cpp =================================================================== --- llvm/lib/Support/FileCheck.cpp +++ llvm/lib/Support/FileCheck.cpp @@ -1284,7 +1284,7 @@ "match discarded, overlaps earlier DAG match here", {OldRange}); if (Diags) - Diags->pop_back(); + Diags->rbegin()->MatchTy = FileCheckDiag::MatchDiscard; } MatchPos = MI->End; } Index: llvm/test/FileCheck/dump-input-annotations.txt =================================================================== --- llvm/test/FileCheck/dump-input-annotations.txt +++ llvm/test/FileCheck/dump-input-annotations.txt @@ -298,7 +298,7 @@ ; NOT2-NOT: {{.}} ;-------------------------------------------------- -; CHECK-DAG (also: matches in different order than directives) +; CHECK-DAG (also: matches in different order than directives, discarded match) ;-------------------------------------------------- ; Good match, discarded match plus good match, and no match. @@ -315,18 +315,23 @@ ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \ ; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG,DAG-Q ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \ -; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG,DAG-V +; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG,DAG-V,DAG-VQ ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \ ; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG,DAG-V,DAG-VV ; DAG: <<<<<< ; DAG-NEXT: 1: abc ; DAG-V-NEXT: dag:2 ^~~ +; DAG-VV-NEXT: dag:3'0 !~~ ; DAG-NEXT: 2: def ; DAG-V-NEXT: dag:1 ^~~ +; DAG-VV-NEXT: dag:4'0 !~~ ; DAG-NEXT: 3: abc -; DAG-V-NEXT: dag:3 ^~~ -; DAG-NEXT: dag:4 X~~ +; DAG-VQ-NEXT: dag:3 ^~~ +; DAG-VV-NEXT: dag:3'1 ^~~ +; DAG-Q-NEXT: dag:4 X~~ +; DAG-VQ-NEXT: dag:4 X~~ +; DAG-VV-NEXT: dag:4'1 X~~ ; DAG-NEXT: >>>>>> ; DAG-NOT: {{.}} Index: llvm/utils/FileCheck/FileCheck.cpp =================================================================== --- llvm/utils/FileCheck/FileCheck.cpp +++ llvm/utils/FileCheck/FileCheck.cpp @@ -144,6 +144,8 @@ return MatchTypeStyle('!', raw_ostream::RED); case FileCheckDiag::MatchFinalButIllegal: return MatchTypeStyle('!', raw_ostream::RED); + case FileCheckDiag::MatchDiscard: + return MatchTypeStyle('!', raw_ostream::CYAN); case FileCheckDiag::MatchNoneButExpected: return MatchTypeStyle('X', raw_ostream::RED); case FileCheckDiag::MatchFuzzy: @@ -183,10 +185,13 @@ OS << " marks bad match, such as:\n" << " - CHECK-NEXT on same line as previous match (error)\n" << " - CHECK-NOT found (error)\n" + << " - CHECK-DAG overlapping match (discarded, reported if " + << "-vv)\n" << " - "; 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-DAG not found after discarded matches (error)\n" << " - "; WithColor(OS, raw_ostream::SAVEDCOLOR, true) << "?"; OS << " marks fuzzy match when no match is found\n"; @@ -199,6 +204,8 @@ OS << ", "; WithColor(OS, raw_ostream::MAGENTA, true) << "fuzzy match"; OS << ", "; + WithColor(OS, raw_ostream::CYAN, true, false) << "discarded match"; + OS << ", "; WithColor(OS, raw_ostream::CYAN, true, true) << "unmatched input"; OS << "\n\n" << "If you are not seeing color above or in input dumps, try: -color\n";