Index: llvm/trunk/include/llvm/Support/FileCheck.h =================================================================== --- llvm/trunk/include/llvm/Support/FileCheck.h +++ llvm/trunk/include/llvm/Support/FileCheck.h @@ -160,7 +160,8 @@ /// 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. /// Indicates the final match for an expected pattern. @@ -170,6 +171,8 @@ /// Indicates the final match for an expected pattern, but the match is on /// the wrong line. MatchFinalButWrongLine, + /// Indicates a discarded match for an expected pattern. + MatchDiscard, /// Indicates no match for an expected pattern. MatchNoneButExpected, /// Indicates a possible intended match because there's no perfect match. Index: llvm/trunk/lib/Support/FileCheck.cpp =================================================================== --- llvm/trunk/lib/Support/FileCheck.cpp +++ llvm/trunk/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/trunk/test/FileCheck/dump-input-annotations.txt =================================================================== --- llvm/trunk/test/FileCheck/dump-input-annotations.txt +++ llvm/trunk/test/FileCheck/dump-input-annotations.txt @@ -302,7 +302,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. @@ -319,18 +319,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 !~~ discard: overlaps earlier match ; DAG-NEXT: 2: def ; DAG-V-NEXT: dag:1 ^~~ +; DAG-VV-NEXT: dag:4'0 !~~ discard: overlaps earlier match ; DAG-NEXT: 3: abc -; DAG-V-NEXT: dag:3 ^~~ -; DAG-NEXT: dag:4 X~~ error: no match found +; DAG-VQ-NEXT: dag:3 ^~~ +; DAG-VV-NEXT: dag:3'1 ^~~ +; DAG-Q-NEXT: dag:4 X~~ error: no match found +; DAG-VQ-NEXT: dag:4 X~~ error: no match found +; DAG-VV-NEXT: dag:4'1 X~~ error: no match found ; DAG-NEXT: >>>>>> ; DAG-NOT: {{.}} Index: llvm/trunk/utils/FileCheck/FileCheck.cpp =================================================================== --- llvm/trunk/utils/FileCheck/FileCheck.cpp +++ llvm/trunk/utils/FileCheck/FileCheck.cpp @@ -150,6 +150,9 @@ return MarkerStyle('!', raw_ostream::RED, "error: no match expected"); case FileCheckDiag::MatchFinalButWrongLine: return MarkerStyle('!', raw_ostream::RED, "error: match on wrong line"); + case FileCheckDiag::MatchDiscard: + return MarkerStyle('!', raw_ostream::CYAN, + "discard: overlaps earlier match"); case FileCheckDiag::MatchNoneButExpected: return MarkerStyle('X', raw_ostream::RED, "error: no match found"); case FileCheckDiag::MatchFuzzy: @@ -191,10 +194,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"; @@ -207,6 +213,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";