Index: llvm/include/llvm/Support/FileCheck.h
===================================================================
--- llvm/include/llvm/Support/FileCheck.h
+++ llvm/include/llvm/Support/FileCheck.h
@@ -169,18 +169,18 @@
   /// same mark in annotated input dumps or else printing of the annotation key
   /// will malfunction.
   enum MatchType {
-    // TODO: More members will appear with later patches in this series.
     MatchFinalAndExpected, //< the final match for an expected pattern
     MatchTypeFirst = MatchFinalAndExpected,
     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
+    MatchNoneAndExcluded,  //< no match for an excluded pattern
     MatchNoneButExpected,  //< no match for an expected pattern
     MatchFuzzy,            //< a fuzzy match (because no perfect match)
     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);
Index: llvm/lib/Support/FileCheck.cpp
===================================================================
--- llvm/lib/Support/FileCheck.cpp
+++ llvm/lib/Support/FileCheck.cpp
@@ -421,9 +421,7 @@
   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 @@
   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 @@
 
     if (Pos == StringRef::npos) {
       PrintNoMatch(false, SM, Prefix, Pat->getLoc(), *Pat, 1, Buffer,
-                   VariableTable, Req.VerboseVerbose, nullptr);
+                   VariableTable, Req.VerboseVerbose, Diags);
       continue;
     }
 
Index: llvm/test/FileCheck/dump-input-annotations.txt
===================================================================
--- llvm/test/FileCheck/dump-input-annotations.txt
+++ llvm/test/FileCheck/dump-input-annotations.txt
@@ -248,7 +248,7 @@
 ; EMP2-NOT:    {{.}}
 
 ;--------------------------------------------------
-; CHECK-NOT (also: EOF pattern)
+; CHECK-NOT (also: EOF pattern, and multiline range that ends before EOL)
 ;--------------------------------------------------
 
 ; No match (success) and illegal match.
@@ -269,9 +269,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     !~~~~
 ; NOT-NEXT:           3: again
+; NOT-VV-NEXT: not:1     ~~~~~
 ; NOT-VV-NEXT:        4:
 ; NOT-VV-NEXT: eof:2     ^
 ; NOT-NEXT:    >>>>>>
@@ -290,9 +293,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       !~~~~
 ; NOT2-NEXT:             3: again
+; NOT2-VV-NEXT: not:1       ~~
 ; NOT2-V-NEXT:  check:3       ^~~
 ; NOT2-NEXT:    >>>>>>
 ; NOT2-NOT:     {{.}}
Index: llvm/utils/FileCheck/FileCheck.cpp
===================================================================
--- llvm/utils/FileCheck/FileCheck.cpp
+++ llvm/utils/FileCheck/FileCheck.cpp
@@ -148,6 +148,11 @@
                           MatchTypeStyle::VerboseVerbose,
                           "a discarded match for an expected pattern (e.g., "
                           "CHECK-DAG)");
+  case FileCheckDiag::MatchNoneAndExcluded:
+    return MatchTypeStyle('X', true, raw_ostream::GREEN,
+                          MatchTypeStyle::VerboseVerbose,
+                          "the search range for an unmatched excluded "
+                          "pattern (e.g., CHECK-NOT)");
   case FileCheckDiag::MatchNoneButExpected:
     return MatchTypeStyle('X', true, raw_ostream::RED, MatchTypeStyle::Quiet,
                           "the search range for an unmatched expected "