Index: llvm/lib/Support/FileCheck.cpp =================================================================== --- llvm/lib/Support/FileCheck.cpp +++ llvm/lib/Support/FileCheck.cpp @@ -1274,6 +1274,7 @@ // found. unsigned LineNumber = 1; + bool FoundPrefix = false; while (1) { Check::FileCheckType CheckTy; @@ -1284,6 +1285,8 @@ FindFirstMatchingPrefix(PrefixRE, Buffer, LineNumber, CheckTy); if (UsedPrefix.empty()) break; + FoundPrefix = true; + assert(UsedPrefix.data() == Buffer.data() && "Failed to move Buffer's start forward, or pointed prefix outside " "of the buffer!"); @@ -1367,9 +1370,13 @@ DagNotMatches = ImplicitNegativeChecks; } - // Add an EOF pattern for any trailing CHECK-DAG/-NOTs, and use the first - // prefix as a filler for the error message. - if (!DagNotMatches.empty()) { + // Add an EOF pattern for any trailing -implicit-check-not/CHECK-DAG/-NOTs, + // and use the first prefix as a filler for the error message. + // We do not allow using -implicit-check-not when an explicitly specified + // check prefix is not present in the input buffer. + bool IsDefaultPrefix = + Req.CheckPrefixes.size() == 1 && Req.CheckPrefixes[0] == "CHECK"; + if ((IsDefaultPrefix || FoundPrefix) && !DagNotMatches.empty()) { CheckStrings->emplace_back( Pattern(Check::CheckEOF, PatternContext.get(), LineNumber + 1), *Req.CheckPrefixes.begin(), SMLoc::getFromPointer(Buffer.data())); Index: llvm/test/FileCheck/implicit-check-not.txt =================================================================== --- llvm/test/FileCheck/implicit-check-not.txt +++ llvm/test/FileCheck/implicit-check-not.txt @@ -1,4 +1,14 @@ ; RUN: sed 's#^;.*##' %s | FileCheck -check-prefix=CHECK-PASS -implicit-check-not=warning: %s + +; Check we report an error when an unknown prefix is used together with `-implicit-check-not` +; RUN: sed 's#^;.*##' %s | not FileCheck -check-prefix=UNKNOWN-PREFIX -implicit-check-not=abc %s 2>&1 | FileCheck %s -check-prefix CHECK-PREFIX-ERROR +; CHECK-PREFIX-ERROR: error: no check strings found with prefix 'UNKNOWN-PREFIX:' + +; Check we allow using `-implicit-check-not` when there is no `-check-prefix` specified and there +; is no default `CHECK` line in an input. Use an arbitrary random unique string as an +; argument for `-implicit-check-not`. +; RUN: sed 's#^;.*##' %s | FileCheck -implicit-check-not="c9e72085-aade-469a-9ad7-c206e1cfe7a9" %s + ; RUN: sed 's#^;.*##' %s | %ProtectFileCheckOutput not FileCheck -check-prefix=CHECK-FAIL1 -implicit-check-not=warning: %s 2>&1 | FileCheck %s -check-prefix CHECK-ERROR1 ; RUN: sed 's#^;.*##' %s | %ProtectFileCheckOutput not FileCheck -check-prefix=CHECK-FAIL2 -implicit-check-not=warning: %s 2>&1 | FileCheck %s -check-prefix CHECK-ERROR2 ; RUN: sed 's#^;.*##' %s | %ProtectFileCheckOutput not FileCheck -check-prefix=CHECK-FAIL3 -implicit-check-not=warning: %s 2>&1 | FileCheck %s -check-prefix CHECK-ERROR3 Index: llvm/test/tools/llvm-objcopy/MachO/strip-debug.test =================================================================== --- llvm/test/tools/llvm-objcopy/MachO/strip-debug.test +++ llvm/test/tools/llvm-objcopy/MachO/strip-debug.test @@ -3,7 +3,7 @@ # RUN: yaml2obj %p/Inputs/strip-all-with-dwarf.yaml -o %t # RUN: llvm-objcopy --strip-debug %t %t.stripped -# RUN: llvm-readobj --sections %t.stripped | FileCheck /dev/null --check-prefix=NODWARF \ +# RUN: llvm-readobj --sections %t.stripped | FileCheck /dev/null \ # RUN: --implicit-check-not='Name: __debug' --implicit-check-not='Name: __apple' ## Make sure that all symbols are kept.