mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
[FileCheck] Fix a bug that cause FileCheck to misidentify check-prefix
FileCheck should check to make sure the prefix was found, and not a word containing it (e.g -check-prefix=BASEREL shouldn't match NOBASEREL). Patch by Ron Ofir. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188221 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d3d5e6d8eb
commit
d9a84efe44
9
test/FileCheck/check-prefixes.txt
Normal file
9
test/FileCheck/check-prefixes.txt
Normal file
@ -0,0 +1,9 @@
|
||||
// RUN: FileCheck -check-prefix=ANOTHER-PREFIX -input-file %s %s
|
||||
// RUN: not FileCheck -check-prefix=PREFIX -input-file %s %s 2>&1 | FileCheck -check-prefix=CHECK-NONEXISTANT-PREFIX %s
|
||||
|
||||
foobar
|
||||
; ANOTHER-PREFIX: foobar
|
||||
|
||||
; We use regex to match the colon so that FileCheck won't think it is a check
|
||||
; prefix.
|
||||
; CHECK-NONEXISTANT-PREFIX: error: no check strings found with prefix 'PREFIX{{:}}'
|
7
test/FileCheck/validate-check-prefix.txt
Normal file
7
test/FileCheck/validate-check-prefix.txt
Normal file
@ -0,0 +1,7 @@
|
||||
// RUN: not FileCheck -check-prefix=A! -input-file %s %s 2>&1 | FileCheck -check-prefix=BAD_PREFIX %s
|
||||
// RUN: FileCheck -check-prefix=A1a-B_c -input-file %s %s
|
||||
|
||||
foobar
|
||||
; A1a-B_c: foobar
|
||||
|
||||
; BAD_PREFIX: Supplied check-prefix is invalid! Prefixes must start with a letter and contain only alphanumeric characters, hyphens and underscores
|
@ -704,15 +704,26 @@ static bool ReadCheckFile(SourceMgr &SM,
|
||||
|
||||
LineNumber += Buffer.substr(0, PrefixLoc).count('\n');
|
||||
|
||||
Buffer = Buffer.substr(PrefixLoc);
|
||||
// Keep the charcter before our prefix so we can validate that we have
|
||||
// found our prefix, and account for cases when PrefixLoc is 0.
|
||||
Buffer = Buffer.substr(std::min(PrefixLoc-1, PrefixLoc));
|
||||
|
||||
const char *CheckPrefixStart = Buffer.data();
|
||||
const char *CheckPrefixStart = Buffer.data() + (PrefixLoc == 0 ? 0 : 1);
|
||||
|
||||
// When we find a check prefix, keep track of whether we find CHECK: or
|
||||
// CHECK-NEXT:
|
||||
bool IsCheckNext = false, IsCheckNot = false, IsCheckDag = false,
|
||||
IsCheckLabel = false;
|
||||
|
||||
// Make sure we have actually found our prefix, and not a word containing
|
||||
// our prefix.
|
||||
if (PrefixLoc != 0 && (isalnum(Buffer[0]) ||
|
||||
Buffer[0] == '-' ||
|
||||
Buffer[0] == '_')) {
|
||||
Buffer = Buffer.substr(CheckPrefix.size());
|
||||
continue;
|
||||
}
|
||||
|
||||
// Verify that the : is present after the prefix.
|
||||
if (Buffer[CheckPrefix.size()] == ':') {
|
||||
Buffer = Buffer.substr(CheckPrefix.size()+1);
|
||||
@ -1026,11 +1037,24 @@ size_t CheckString::CheckDag(const SourceMgr &SM, StringRef Buffer,
|
||||
return LastPos;
|
||||
}
|
||||
|
||||
bool ValidateCheckPrefix() {
|
||||
// The check prefix must contain only alphanumeric, hyphens and underscores.
|
||||
Regex prefixValidator("^[a-zA-Z0-9_-]*$");
|
||||
return prefixValidator.match(CheckPrefix);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
sys::PrintStackTraceOnErrorSignal();
|
||||
PrettyStackTraceProgram X(argc, argv);
|
||||
cl::ParseCommandLineOptions(argc, argv);
|
||||
|
||||
if (!ValidateCheckPrefix()) {
|
||||
errs() << "Supplied check-prefix is invalid! Prefixes must start with a "
|
||||
"letter and contain only alphanumeric characters, hyphens and "
|
||||
"underscores\n";
|
||||
return 2;
|
||||
}
|
||||
|
||||
SourceMgr SM;
|
||||
|
||||
// Read the expected strings from the check file.
|
||||
|
Loading…
Reference in New Issue
Block a user