Index: clang/test/CodeGen/catch-implicit-conversions-basics-negatives.c =================================================================== --- clang/test/CodeGen/catch-implicit-conversions-basics-negatives.c +++ clang/test/CodeGen/catch-implicit-conversions-basics-negatives.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsanitize=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change -fsanitize-recover=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK +// RUN: %clang_cc1 -fsanitize=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change -fsanitize-recover=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" // If we have an enum, it will be promoted to an unsigned integer. // But both types are unsigned, and have same bitwidth. 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,16 +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()) { - CheckStrings->emplace_back( - Pattern(Check::CheckEOF, PatternContext.get(), LineNumber + 1), - *Req.CheckPrefixes.begin(), SMLoc::getFromPointer(Buffer.data())); - std::swap(DagNotMatches, CheckStrings->back().DagNotStrings); - } - - if (CheckStrings->empty()) { + // When there are no used prefixes we report an error. + // We do not allow using -implicit-check-not when an explicitly specified + // check prefix is not present in the input buffer. + if (!FoundUsedPrefix && + (ImplicitNegativeChecks.empty() || !Req.IsDefaultCheckPrefix)) { errs() << "error: no check strings found with prefix" << (Req.CheckPrefixes.size() > 1 ? "es " : " "); auto I = Req.CheckPrefixes.begin(); @@ -1392,6 +1390,15 @@ return true; } + // 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()) { + CheckStrings->emplace_back( + Pattern(Check::CheckEOF, PatternContext.get(), LineNumber + 1), + *Req.CheckPrefixes.begin(), SMLoc::getFromPointer(Buffer.data())); + std::swap(DagNotMatches, CheckStrings->back().DagNotStrings); + } + return false; } @@ -1857,8 +1864,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,16 @@ ; 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 "CHECK" prefix is used explicitly 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. +; RUN: sed 's#^;.*##' %s | FileCheck -implicit-check-not="unique_string" %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.