[llvm] r374538 - [FileCheck] Implement --ignore-case option.
Kai Nacke via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 11 04:59:14 PDT 2019
Author: redstar
Date: Fri Oct 11 04:59:14 2019
New Revision: 374538
URL: http://llvm.org/viewvc/llvm-project?rev=374538&view=rev
Log:
[FileCheck] Implement --ignore-case option.
The FileCheck utility is enhanced to support a `--ignore-case`
option. This is useful in cases where the output of Unix tools
differs in case (e.g. case not specified by Posix).
Reviewers: Bigcheese, jakehehrlich, rupprecht, espindola, alexshap, jhenderson, MaskRay
Differential Revision: https://reviews.llvm.org/D68146
Added:
llvm/trunk/test/FileCheck/check-ignore-case.txt
Modified:
llvm/trunk/docs/CommandGuide/FileCheck.rst
llvm/trunk/include/llvm/Support/FileCheck.h
llvm/trunk/lib/Support/FileCheck.cpp
llvm/trunk/lib/Support/FileCheckImpl.h
llvm/trunk/utils/FileCheck/FileCheck.cpp
Modified: llvm/trunk/docs/CommandGuide/FileCheck.rst
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CommandGuide/FileCheck.rst?rev=374538&r1=374537&r2=374538&view=diff
==============================================================================
--- llvm/trunk/docs/CommandGuide/FileCheck.rst (original)
+++ llvm/trunk/docs/CommandGuide/FileCheck.rst Fri Oct 11 04:59:14 2019
@@ -71,6 +71,11 @@ and from the command line.
The :option:`--strict-whitespace` argument disables this behavior. End-of-line
sequences are canonicalized to UNIX-style ``\n`` in all modes.
+.. option:: --ignore-case
+
+ By default, FileCheck uses case-sensitive matching. This option causes
+ FileCheck to use case-insensitive matching.
+
.. option:: --implicit-check-not check-pattern
Adds implicit negative checks for the specified patterns between positive
Modified: llvm/trunk/include/llvm/Support/FileCheck.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FileCheck.h?rev=374538&r1=374537&r2=374538&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/FileCheck.h (original)
+++ llvm/trunk/include/llvm/Support/FileCheck.h Fri Oct 11 04:59:14 2019
@@ -30,6 +30,7 @@ struct FileCheckRequest {
std::vector<std::string> GlobalDefines;
bool AllowEmptyInput = false;
bool MatchFullLines = false;
+ bool IgnoreCase = false;
bool EnableVarScope = false;
bool AllowDeprecatedDagOverlap = false;
bool Verbose = false;
Modified: llvm/trunk/lib/Support/FileCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FileCheck.cpp?rev=374538&r1=374537&r2=374538&view=diff
==============================================================================
--- llvm/trunk/lib/Support/FileCheck.cpp (original)
+++ llvm/trunk/lib/Support/FileCheck.cpp Fri Oct 11 04:59:14 2019
@@ -320,6 +320,7 @@ bool FileCheckPattern::parsePattern(Stri
SourceMgr &SM,
const FileCheckRequest &Req) {
bool MatchFullLinesHere = Req.MatchFullLines && CheckTy != Check::CheckNot;
+ IgnoreCase = Req.IgnoreCase;
PatternLoc = SMLoc::getFromPointer(PatternStr.data());
@@ -619,7 +620,8 @@ Expected<size_t> FileCheckPattern::match
// If this is a fixed string pattern, just match it now.
if (!FixedStr.empty()) {
MatchLen = FixedStr.size();
- size_t Pos = Buffer.find(FixedStr);
+ size_t Pos = IgnoreCase ? Buffer.find_lower(FixedStr)
+ : Buffer.find(FixedStr);
if (Pos == StringRef::npos)
return make_error<FileCheckNotFoundError>();
return Pos;
@@ -657,7 +659,10 @@ Expected<size_t> FileCheckPattern::match
}
SmallVector<StringRef, 4> MatchInfo;
- if (!Regex(RegExToMatch, Regex::Newline).match(Buffer, &MatchInfo))
+ unsigned int Flags = Regex::Newline;
+ if (IgnoreCase)
+ Flags |= Regex::IgnoreCase;
+ if (!Regex(RegExToMatch, Flags).match(Buffer, &MatchInfo))
return make_error<FileCheckNotFoundError>();
// Successful regex match.
Modified: llvm/trunk/lib/Support/FileCheckImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FileCheckImpl.h?rev=374538&r1=374537&r2=374538&view=diff
==============================================================================
--- llvm/trunk/lib/Support/FileCheckImpl.h (original)
+++ llvm/trunk/lib/Support/FileCheckImpl.h Fri Oct 11 04:59:14 2019
@@ -428,6 +428,9 @@ class FileCheckPattern {
/// line to the one with this CHECK.
Optional<size_t> LineNumber;
+ /// Ignore case while matching if set to true.
+ bool IgnoreCase = false;
+
public:
FileCheckPattern(Check::FileCheckType Ty, FileCheckPatternContext *Context,
Optional<size_t> Line = None)
Added: llvm/trunk/test/FileCheck/check-ignore-case.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/FileCheck/check-ignore-case.txt?rev=374538&view=auto
==============================================================================
--- llvm/trunk/test/FileCheck/check-ignore-case.txt (added)
+++ llvm/trunk/test/FileCheck/check-ignore-case.txt Fri Oct 11 04:59:14 2019
@@ -0,0 +1,45 @@
+## Check that a full line is matched case insensitively.
+# RUN: FileCheck --ignore-case --match-full-lines --check-prefix=FULL --input-file=%s %s
+
+## Check that a regular expression matches case insensitively.
+# RUN: FileCheck --ignore-case --check-prefix=REGEX --input-file=%s %s
+
+## Check that a pattern from command line matches case insensitively.
+# RUN: FileCheck --ignore-case --check-prefix=PAT --DPATTERN="THIS is the" --input-file=%s %s
+
+## Check that COUNT and NEXT work case insensitively.
+# RUN: FileCheck --ignore-case --check-prefix=CNT --input-file=%s %s
+
+## Check that match on same line works case insensitively.
+# RUN: FileCheck --ignore-case --check-prefix=LINE --input-file=%s %s
+
+## Check that option --implicit-not works case insensitively.
+# RUN: sed '/^#/d' %s | FileCheck --implicit-check-not=sTrInG %s
+# RUN: sed '/^#/d' %s | not FileCheck --ignore-case --implicit-check-not=sTrInG %s 2>&1 | FileCheck --check-prefix=ERROR %s
+
+this is the STRING to be matched
+
+# FULL: tHis iS The String TO be matched
+# REGEX: s{{TRing}}
+# PAT: [[PATTERN]] string
+
+Loop 1
+lOop 2
+loOp 3
+looP 4
+loop 5
+LOOP 6
+BREAK
+
+# CNT-COUNT-6: LOop {{[0-9]}}
+# CNT-NOT: loop
+# CNT-NEXT: break
+
+One Line To Match
+
+# LINE: {{o}}ne line
+# LINE-SAME: {{t}}o match
+
+# ERROR: command line:1:{{[0-9]+}}: error: CHECK-NOT: excluded string found in input
+# ERROR-NEXT: -implicit-check-not='sTrInG'
+# ERROR: note: found here
Modified: llvm/trunk/utils/FileCheck/FileCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileCheck/FileCheck.cpp?rev=374538&r1=374537&r2=374538&view=diff
==============================================================================
--- llvm/trunk/utils/FileCheck/FileCheck.cpp (original)
+++ llvm/trunk/utils/FileCheck/FileCheck.cpp Fri Oct 11 04:59:14 2019
@@ -48,6 +48,10 @@ static cl::opt<bool> NoCanonicalizeWhite
"strict-whitespace",
cl::desc("Do not treat all horizontal whitespace as equivalent"));
+static cl::opt<bool> IgnoreCase(
+ "ignore-case",
+ cl::desc("Use case-insensitive matching"));
+
static cl::list<std::string> ImplicitCheckNot(
"implicit-check-not",
cl::desc("Add an implicit negative check with this pattern to every\n"
@@ -555,6 +559,7 @@ int main(int argc, char **argv) {
Req.VerboseVerbose = VerboseVerbose;
Req.NoCanonicalizeWhiteSpace = NoCanonicalizeWhiteSpace;
Req.MatchFullLines = MatchFullLines;
+ Req.IgnoreCase = IgnoreCase;
if (VerboseVerbose)
Req.Verbose = true;
More information about the llvm-commits
mailing list