mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
[FileCheck] Report missing prefixes when more than one is provided.
If more than a prefix is provided - e.g. --check-prefixes=CHECK,FOO - we don't report if (say) FOO is never used. This may lead to a gap in our test coverage. This patch introduces a new option, --allow-unused-prefixes. It currently is set to true, keeping today's behavior. After we explicitly set it in tests where this behavior was actually intentional, we will switch it to false by default. Differential Revision: https://reviews.llvm.org/D90281
This commit is contained in:
parent
46e2484ccc
commit
3afc00f390
@ -30,6 +30,7 @@ struct FileCheckRequest {
|
|||||||
std::vector<StringRef> ImplicitCheckNot;
|
std::vector<StringRef> ImplicitCheckNot;
|
||||||
std::vector<StringRef> GlobalDefines;
|
std::vector<StringRef> GlobalDefines;
|
||||||
bool AllowEmptyInput = false;
|
bool AllowEmptyInput = false;
|
||||||
|
bool AllowUnusedPrefixes = false;
|
||||||
bool MatchFullLines = false;
|
bool MatchFullLines = false;
|
||||||
bool IgnoreCase = false;
|
bool IgnoreCase = false;
|
||||||
bool IsDefaultCheckPrefix = false;
|
bool IsDefaultCheckPrefix = false;
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "llvm/Support/FormatVariadic.h"
|
#include "llvm/Support/FormatVariadic.h"
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <set>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
@ -1825,8 +1826,10 @@ bool FileCheck::readCheckFile(
|
|||||||
// found.
|
// found.
|
||||||
unsigned LineNumber = 1;
|
unsigned LineNumber = 1;
|
||||||
|
|
||||||
bool FoundUsedCheckPrefix = false;
|
std::set<StringRef> PrefixesNotFound(Req.CheckPrefixes.begin(),
|
||||||
while (1) {
|
Req.CheckPrefixes.end());
|
||||||
|
const size_t DistinctPrefixes = PrefixesNotFound.size();
|
||||||
|
while (true) {
|
||||||
Check::FileCheckType CheckTy;
|
Check::FileCheckType CheckTy;
|
||||||
|
|
||||||
// See if a prefix occurs in the memory buffer.
|
// See if a prefix occurs in the memory buffer.
|
||||||
@ -1837,7 +1840,7 @@ bool FileCheck::readCheckFile(
|
|||||||
if (UsedPrefix.empty())
|
if (UsedPrefix.empty())
|
||||||
break;
|
break;
|
||||||
if (CheckTy != Check::CheckComment)
|
if (CheckTy != Check::CheckComment)
|
||||||
FoundUsedCheckPrefix = true;
|
PrefixesNotFound.erase(UsedPrefix);
|
||||||
|
|
||||||
assert(UsedPrefix.data() == Buffer.data() &&
|
assert(UsedPrefix.data() == Buffer.data() &&
|
||||||
"Failed to move Buffer's start forward, or pointed prefix outside "
|
"Failed to move Buffer's start forward, or pointed prefix outside "
|
||||||
@ -1930,14 +1933,19 @@ bool FileCheck::readCheckFile(
|
|||||||
|
|
||||||
// When there are no used prefixes we report an error except in the case that
|
// When there are no used prefixes we report an error except in the case that
|
||||||
// no prefix is specified explicitly but -implicit-check-not is specified.
|
// no prefix is specified explicitly but -implicit-check-not is specified.
|
||||||
if (!FoundUsedCheckPrefix &&
|
const bool NoPrefixesFound = PrefixesNotFound.size() == DistinctPrefixes;
|
||||||
|
const bool SomePrefixesUnexpectedlyNotUsed =
|
||||||
|
!Req.AllowUnusedPrefixes && !PrefixesNotFound.empty();
|
||||||
|
if ((NoPrefixesFound || SomePrefixesUnexpectedlyNotUsed) &&
|
||||||
(ImplicitNegativeChecks.empty() || !Req.IsDefaultCheckPrefix)) {
|
(ImplicitNegativeChecks.empty() || !Req.IsDefaultCheckPrefix)) {
|
||||||
errs() << "error: no check strings found with prefix"
|
errs() << "error: no check strings found with prefix"
|
||||||
<< (Req.CheckPrefixes.size() > 1 ? "es " : " ");
|
<< (PrefixesNotFound.size() > 1 ? "es " : " ");
|
||||||
for (size_t I = 0, E = Req.CheckPrefixes.size(); I != E; ++I) {
|
bool First = true;
|
||||||
if (I != 0)
|
for (StringRef MissingPrefix : PrefixesNotFound) {
|
||||||
|
if (!First)
|
||||||
errs() << ", ";
|
errs() << ", ";
|
||||||
errs() << "\'" << Req.CheckPrefixes[I] << ":'";
|
errs() << "\'" << MissingPrefix << ":'";
|
||||||
|
First = false;
|
||||||
}
|
}
|
||||||
errs() << '\n';
|
errs() << '\n';
|
||||||
return true;
|
return true;
|
||||||
|
2
test/FileCheck/Inputs/one-check.txt
Normal file
2
test/FileCheck/Inputs/one-check.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
hello
|
||||||
|
; P1: hello
|
10
test/FileCheck/allow-unused-prefixes.txt
Normal file
10
test/FileCheck/allow-unused-prefixes.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
; RUN: not FileCheck --allow-unused-prefixes=false --check-prefixes=P1,P2 --input-file %S/Inputs/one-check.txt %S/Inputs/one-check.txt 2>&1 | FileCheck --check-prefix=MISSING-ONE %s
|
||||||
|
; RUN: not FileCheck --allow-unused-prefixes=false --check-prefixes=P1,P2,P3 --input-file %S/Inputs/one-check.txt %S/Inputs/one-check.txt 2>&1 | FileCheck --check-prefix=MISSING-MORE %s
|
||||||
|
; RUN: FileCheck --allow-unused-prefixes=true --check-prefixes=P1,P2 --input-file %S/Inputs/one-check.txt %S/Inputs/one-check.txt
|
||||||
|
|
||||||
|
; Note: the default will be changed to 'false', at which time this run line
|
||||||
|
; should be changed accordingly.
|
||||||
|
; RUN: FileCheck --check-prefixes=P1,P2 --input-file %S/Inputs/one-check.txt %S/Inputs/one-check.txt
|
||||||
|
|
||||||
|
; MISSING-ONE: error: no check strings found with prefix 'P2:'
|
||||||
|
; MISSING-MORE: error: no check strings found with prefixes 'P2:', 'P3:'
|
@ -77,6 +77,10 @@ static cl::opt<bool> AllowEmptyInput(
|
|||||||
cl::desc("Allow the input file to be empty. This is useful when making\n"
|
cl::desc("Allow the input file to be empty. This is useful when making\n"
|
||||||
"checks that some error message does not occur, for example."));
|
"checks that some error message does not occur, for example."));
|
||||||
|
|
||||||
|
static cl::opt<bool> AllowUnusedPrefixes(
|
||||||
|
"allow-unused-prefixes", cl::init(true),
|
||||||
|
cl::desc("Allow prefixes to be specified but not appear in the test."));
|
||||||
|
|
||||||
static cl::opt<bool> MatchFullLines(
|
static cl::opt<bool> MatchFullLines(
|
||||||
"match-full-lines", cl::init(false),
|
"match-full-lines", cl::init(false),
|
||||||
cl::desc("Require all positive matches to cover an entire input line.\n"
|
cl::desc("Require all positive matches to cover an entire input line.\n"
|
||||||
@ -771,6 +775,7 @@ int main(int argc, char **argv) {
|
|||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
Req.AllowEmptyInput = AllowEmptyInput;
|
Req.AllowEmptyInput = AllowEmptyInput;
|
||||||
|
Req.AllowUnusedPrefixes = AllowUnusedPrefixes;
|
||||||
Req.EnableVarScope = EnableVarScope;
|
Req.EnableVarScope = EnableVarScope;
|
||||||
Req.AllowDeprecatedDagOverlap = AllowDeprecatedDagOverlap;
|
Req.AllowDeprecatedDagOverlap = AllowDeprecatedDagOverlap;
|
||||||
Req.Verbose = Verbose;
|
Req.Verbose = Verbose;
|
||||||
|
Loading…
Reference in New Issue
Block a user