Index: llvm/include/llvm/Support/FileCheck.h =================================================================== --- llvm/include/llvm/Support/FileCheck.h +++ llvm/include/llvm/Support/FileCheck.h @@ -31,6 +31,7 @@ bool AllowEmptyInput = false; bool MatchFullLines = false; bool IgnoreCase = false; + bool IsDefaultCheckPrefix = false; bool EnableVarScope = false; bool AllowDeprecatedDagOverlap = false; bool Verbose = false; 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 FoundUsedPrefix = false; while (1) { Check::FileCheckType CheckTy; @@ -1284,6 +1285,8 @@ FindFirstMatchingPrefix(PrefixRE, Buffer, LineNumber, CheckTy); if (UsedPrefix.empty()) break; + FoundUsedPrefix = true; + assert(UsedPrefix.data() == Buffer.data() && "Failed to move Buffer's start forward, or pointed prefix outside " "of the buffer!"); @@ -1367,9 +1370,11 @@ 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. + if ((Req.IsDefaultCheckPrefix || FoundUsedPrefix) && !DagNotMatches.empty()) { CheckStrings->emplace_back( Pattern(Check::CheckEOF, PatternContext.get(), LineNumber + 1), *Req.CheckPrefixes.begin(), SMLoc::getFromPointer(Buffer.data())); @@ -1857,8 +1862,10 @@ Regex FileCheck::buildCheckPrefixRegex() { // I don't think there's a way to specify an initial value for cl::list, // so if nothing was specified, add the default - if (Req.CheckPrefixes.empty()) + if (Req.CheckPrefixes.empty()) { Req.CheckPrefixes.push_back("CHECK"); + Req.IsDefaultCheckPrefix = true; + } // We already validated the contents of CheckPrefixes so just concatenate // them as alternatives. 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,17 @@ ; 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 | %ProtectFileCheckOutput not FileCheck -check-prefix=UNKNOWN-PREFIX -implicit-check-not=abc %s 2>&1 | FileCheck %s -DPREFIX=UNKNOWN-PREFIX -check-prefix CHECK-PREFIX-ERROR +; CHECK-PREFIX-ERROR: error: no check strings found with prefix '[[PREFIX]]:' + +; Check we report an error when the default "CHECK" prefix is used together with `-implicit-check-not`, but not present in the input. +; RUN: sed 's#^;.*##' %s | %ProtectFileCheckOutput not FileCheck -check-prefix=CHECK -implicit-check-not=abc %s 2>&1 | FileCheck %s -DPREFIX=CHECK -check-prefix CHECK-PREFIX-ERROR + +; 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.