aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/FileCheck/FileCheck.cpp
diff options
context:
space:
mode:
authorIvan Kosarev <ivan.kosarev@amd.com>2022-05-26 09:48:01 +0100
committerIvan Kosarev <ivan.kosarev@amd.com>2022-05-26 11:37:19 +0100
commitad1d60c3befd606d6864b367f939238e50fb0f7e (patch)
tree4ecfbc1cee2f801fca333ac9d0d69dbf0bc1150d /llvm/lib/FileCheck/FileCheck.cpp
parent73c3dff1b3e42c278f4c675418b0cb5e8784174b (diff)
downloadllvm-ad1d60c3befd606d6864b367f939238e50fb0f7e.zip
llvm-ad1d60c3befd606d6864b367f939238e50fb0f7e.tar.gz
llvm-ad1d60c3befd606d6864b367f939238e50fb0f7e.tar.bz2
[FileCheck] Catch missspelled directives.
Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D125604
Diffstat (limited to 'llvm/lib/FileCheck/FileCheck.cpp')
-rw-r--r--llvm/lib/FileCheck/FileCheck.cpp28
1 files changed, 26 insertions, 2 deletions
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index 6186af4..bf13b6c 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -1651,6 +1651,8 @@ std::string Check::FileCheckType::getDescription(StringRef Prefix) const {
switch (Kind) {
case Check::CheckNone:
return "invalid";
+ case Check::CheckMisspelled:
+ return "misspelled";
case Check::CheckPlain:
if (Count > 1)
return WithModifiers("-COUNT");
@@ -1680,7 +1682,8 @@ std::string Check::FileCheckType::getDescription(StringRef Prefix) const {
}
static std::pair<Check::FileCheckType, StringRef>
-FindCheckType(const FileCheckRequest &Req, StringRef Buffer, StringRef Prefix) {
+FindCheckType(const FileCheckRequest &Req, StringRef Buffer, StringRef Prefix,
+ bool &Misspelled) {
if (Buffer.size() <= Prefix.size())
return {Check::CheckNone, StringRef()};
@@ -1722,7 +1725,9 @@ FindCheckType(const FileCheckRequest &Req, StringRef Buffer, StringRef Prefix) {
if (Rest.front() == '{')
return ConsumeModifiers(Check::CheckPlain);
- if (!Rest.consume_front("-"))
+ if (Rest.consume_front("_"))
+ Misspelled = true;
+ else if (!Rest.consume_front("-"))
return {Check::CheckNone, StringRef()};
if (Rest.consume_front("COUNT-")) {
@@ -1766,6 +1771,15 @@ FindCheckType(const FileCheckRequest &Req, StringRef Buffer, StringRef Prefix) {
return {Check::CheckNone, Rest};
}
+static std::pair<Check::FileCheckType, StringRef>
+FindCheckType(const FileCheckRequest &Req, StringRef Buffer, StringRef Prefix) {
+ bool Misspelled = false;
+ auto Res = FindCheckType(Req, Buffer, Prefix, Misspelled);
+ if (Res.first != Check::CheckNone && Misspelled)
+ return {Check::CheckMisspelled, Res.second};
+ return Res;
+}
+
// From the given position, find the next character after the word.
static size_t SkipWord(StringRef Str, size_t Loc) {
while (Loc < Str.size() && IsPartOfWord(Str[Loc]))
@@ -1939,6 +1953,16 @@ bool FileCheck::readCheckFile(
Buffer = AfterSuffix.empty() ? Buffer.drop_front(UsedPrefix.size())
: AfterSuffix;
+ // Complain about misspelled directives.
+ if (CheckTy == Check::CheckMisspelled) {
+ StringRef UsedDirective(UsedPrefix.data(),
+ AfterSuffix.data() - UsedPrefix.data());
+ SM.PrintMessage(SMLoc::getFromPointer(UsedDirective.data()),
+ SourceMgr::DK_Error,
+ "misspelled directive '" + UsedDirective + "'");
+ return true;
+ }
+
// Complain about useful-looking but unsupported suffixes.
if (CheckTy == Check::CheckBadNot) {
SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()), SourceMgr::DK_Error,