From 64e0b7fbc6702fddbfe3c6292b51c1083af08e07 Mon Sep 17 00:00:00 2001 From: Nikolai Filchenko Date: Wed, 2 Nov 2022 15:26:18 +0100 Subject: [PATCH 1/2] Fix deadalean-strings --- .../clang-tidy/daedalean/StringsCheck.cpp | 29 +++++++++++++++++-- .../clang-tidy/checkers/daedalean-strings.cpp | 29 ++++++++++++++++--- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/clang-tools-extra/clang-tidy/daedalean/StringsCheck.cpp b/clang-tools-extra/clang-tidy/daedalean/StringsCheck.cpp index 08f37324c49d1e..3cfe9d0f6d2151 100644 --- a/clang-tools-extra/clang-tidy/daedalean/StringsCheck.cpp +++ b/clang-tools-extra/clang-tidy/daedalean/StringsCheck.cpp @@ -17,14 +17,37 @@ namespace tidy { namespace daedalean { void StringsCheck::registerMatchers(MatchFinder *Finder) { - Finder->addMatcher(stringLiteral(unless(hasParent(userDefinedLiteral()))) - .bind("string-literal"), - this); + Finder->addMatcher( + traverse(TK_IgnoreUnlessSpelledInSource, + stringLiteral(unless(anyOf(hasParent(userDefinedLiteral()), + hasParent(staticAssertDecl())))) + .bind("string-literal")), + this); } void StringsCheck::check(const MatchFinder::MatchResult &Result) { const StringLiteral *StringLiteralDecl = Result.Nodes.getNodeAs("string-literal"); + + auto parents = Result.Context->getParents(*StringLiteralDecl); + + if (parents.size() == 1) { + if (const auto *callExpr = parents[0].get()) { + if (auto *cast = + llvm::dyn_cast(callExpr->getCallee())) { + if (auto *decl = + llvm::dyn_cast(cast->getSubExpr())) { + if (auto *func = + llvm::dyn_cast(decl->getDecl())) { + if (auto *lit = func->getLiteralIdentifier()) { + return; + } + } + } + } + } + } + diag(StringLiteralDecl->getExprLoc(), "C-String literals MUST not be used"); } diff --git a/clang-tools-extra/test/clang-tidy/checkers/daedalean-strings.cpp b/clang-tools-extra/test/clang-tidy/checkers/daedalean-strings.cpp index 4387790ecc3440..8cc644eded9cd7 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/daedalean-strings.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/daedalean-strings.cpp @@ -1,21 +1,42 @@ // RUN: %check_clang_tidy %s daedalean-strings %t struct StringView final { + + constexpr StringView(const char * p, unsigned long l) : ptr(p), len(l) {} + const char *ptr; unsigned long len; }; -StringView operator""_s(const char *ptr, const unsigned long len) { - return StringView{.ptr = ptr, .len = len}; +constexpr StringView operator""_s(const char *ptr, const unsigned long len) { + return {ptr, len}; } +void abort(const char*, unsigned long); + +template +class C { +public: + constexpr void foo() noexcept { + constexpr StringView STR = "HELLO"_s; + abort(STR.ptr, STR.len); + } +}; + +void b(const char *ptr); + void f(const char *ptr) { const char *another = ""; // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: C-String literals MUST not be used [daedalean-strings] + (void)another; StringView test = ""_s; + (void)test; - f(""); + b(""); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: C-String literals MUST not be used [daedalean-strings] - f(""_s.ptr); + b(""_s.ptr); + + C var; + var.foo(); } From 386c3ca10297b35d222cb0b415b4fd9dd15d5133 Mon Sep 17 00:00:00 2001 From: Nikolai Filchenko Date: Thu, 3 Nov 2022 11:35:42 +0100 Subject: [PATCH 2/2] Fix build --- .../clang-tidy/checkers/daedalean-strings.cpp | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/daedalean-strings.cpp b/clang-tools-extra/test/clang-tidy/checkers/daedalean-strings.cpp index 8cc644eded9cd7..4387790ecc3440 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/daedalean-strings.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/daedalean-strings.cpp @@ -1,42 +1,21 @@ // RUN: %check_clang_tidy %s daedalean-strings %t struct StringView final { - - constexpr StringView(const char * p, unsigned long l) : ptr(p), len(l) {} - const char *ptr; unsigned long len; }; -constexpr StringView operator""_s(const char *ptr, const unsigned long len) { - return {ptr, len}; +StringView operator""_s(const char *ptr, const unsigned long len) { + return StringView{.ptr = ptr, .len = len}; } -void abort(const char*, unsigned long); - -template -class C { -public: - constexpr void foo() noexcept { - constexpr StringView STR = "HELLO"_s; - abort(STR.ptr, STR.len); - } -}; - -void b(const char *ptr); - void f(const char *ptr) { const char *another = ""; // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: C-String literals MUST not be used [daedalean-strings] - (void)another; StringView test = ""_s; - (void)test; - b(""); + f(""); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: C-String literals MUST not be used [daedalean-strings] - b(""_s.ptr); - - C var; - var.foo(); + f(""_s.ptr); }