diff options
author | Ivan Kosarev <ivan.kosarev@amd.com> | 2022-05-26 09:48:01 +0100 |
---|---|---|
committer | Ivan Kosarev <ivan.kosarev@amd.com> | 2022-05-26 11:37:19 +0100 |
commit | ad1d60c3befd606d6864b367f939238e50fb0f7e (patch) | |
tree | 4ecfbc1cee2f801fca333ac9d0d69dbf0bc1150d /llvm/lib/FileCheck/FileCheck.cpp | |
parent | 73c3dff1b3e42c278f4c675418b0cb5e8784174b (diff) | |
download | llvm-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.cpp | 28 |
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, |