return StartPos;
}
-static bool ValidatePrefixes(StringSet<> &UniquePrefixes,
- ArrayRef<StringRef> SuppliedPrefixes) {
- for (StringRef Prefix : SuppliedPrefixes) {
- if (Prefix.empty()) {
- errs() << "error: supplied check prefix must not be the empty string\n";
+// A check prefix must contain only alphanumeric, hyphens and underscores.
+static bool ValidateCheckPrefix(StringRef CheckPrefix) {
+ static const Regex Validator("^[a-zA-Z0-9_-]*$");
+ return Validator.match(CheckPrefix);
+}
+
+bool FileCheck::ValidateCheckPrefixes() {
+ StringSet<> PrefixSet;
+
+ for (StringRef Prefix : Req.CheckPrefixes) {
+ // Reject empty prefixes.
+ if (Prefix.empty())
return false;
- }
- static const Regex Validator("^[a-zA-Z0-9_-]*$");
- if (!Validator.match(Prefix)) {
- errs() << "error: supplied check prefix must start with a letter and "
- << "contain only alphanumeric characters, hyphens, and "
- << "underscores: '" << Prefix << "'\n";
+
+ if (!PrefixSet.insert(Prefix).second)
return false;
- }
- if (!UniquePrefixes.insert(Prefix).second) {
- errs() << "error: supplied check prefix must be unique among check "
- << "prefixes: '" << Prefix << "'\n";
+
+ if (!ValidateCheckPrefix(Prefix))
return false;
- }
}
- return true;
-}
-bool FileCheck::ValidateCheckPrefixes() {
- StringSet<> UniquePrefixes;
- if (!ValidatePrefixes(UniquePrefixes, Req.CheckPrefixes))
- return false;
return true;
}
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()) {
Req.CheckPrefixes.push_back("CHECK");
Req.IsDefaultCheckPrefix = true;
// RUN: %ProtectFileCheckOutput 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
-// RUN: %ProtectFileCheckOutput not FileCheck -check-prefix=REPEAT -check-prefix=REPEAT -input-file %s %s 2>&1 | FileCheck -check-prefix=DUPLICATE_PREFIX %s
+// RUN: %ProtectFileCheckOutput not FileCheck -check-prefix=REPEAT -check-prefix=REPEAT -input-file %s %s 2>&1 | FileCheck -check-prefix=BAD_PREFIX %s
// RUN: %ProtectFileCheckOutput not FileCheck -check-prefix=VALID -check-prefix=A! -input-file %s %s 2>&1 | FileCheck -check-prefix=BAD_PREFIX %s
-// RUN: %ProtectFileCheckOutput not FileCheck -check-prefix= -input-file %s %s 2>&1 | FileCheck -check-prefix=EMPTY_PREFIX %s
+// RUN: %ProtectFileCheckOutput not FileCheck -check-prefix= -input-file %s %s 2>&1 | FileCheck -check-prefix=BAD_PREFIX %s
foobar
; A1a-B_c: foobar
-; BAD_PREFIX: supplied check prefix must start with a letter and contain only alphanumeric characters, hyphens, and underscores: 'A!'
-
-; DUPLICATE_PREFIX: error: supplied check prefix must be unique among check prefixes: 'REPEAT'
-
-; EMPTY_PREFIX: error: supplied check prefix must not be the empty string
+; BAD_PREFIX: Supplied check-prefix is invalid! Prefixes must be
+ unique and start with a letter and contain only alphanumeric characters, hyphens and underscores
Req.Verbose = true;
FileCheck FC(Req);
- if (!FC.ValidateCheckPrefixes())
+ if (!FC.ValidateCheckPrefixes()) {
+ errs() << "Supplied check-prefix is invalid! Prefixes must be unique and "
+ "start with a letter and contain only alphanumeric characters, "
+ "hyphens and underscores\n";
return 2;
+ }
Regex PrefixRE = FC.buildCheckPrefixRegex();
std::string REError;