https://github.com/irishrover updated https://github.com/llvm/llvm-project/pull/179027
>From b5b9ff6aa9f74f20b220f4b420b840ff350d1f68 Mon Sep 17 00:00:00 2001 From: Zinovy Nis <[email protected]> Date: Sat, 31 Jan 2026 12:56:30 +0300 Subject: [PATCH] [clang-tidy] Temp fix for assert in performance-string-view-conversions --- .../StringViewConversionsCheck.cpp | 9 ++++--- .../clang-tidy/checkers/Inputs/Headers/string | 2 +- .../string-view-conversions-cxx20.cpp | 6 ++--- .../performance/string-view-conversions.cpp | 24 +++++++++++-------- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/clang-tools-extra/clang-tidy/performance/StringViewConversionsCheck.cpp b/clang-tools-extra/clang-tidy/performance/StringViewConversionsCheck.cpp index f09f6f203bf3a..aebbec5e9b913 100644 --- a/clang-tools-extra/clang-tidy/performance/StringViewConversionsCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/StringViewConversionsCheck.cpp @@ -78,13 +78,13 @@ void StringViewConversionsCheck::registerMatchers(MatchFinder *Finder) { .bind("redundantExpr")), // Exclude cases of std::string methods or operator+ calls unless(anyOf(HasStringOperatorCall, HasStringMethodCall))) - .bind("expr"), + .bind("paramExpr"), parmVarDecl(hasType(IsStdStringView)))), this); } void StringViewConversionsCheck::check(const MatchFinder::MatchResult &Result) { - const auto *ParamExpr = Result.Nodes.getNodeAs<Expr>("expr"); + const auto *ParamExpr = Result.Nodes.getNodeAs<Expr>("paramExpr"); const auto *RedundantExpr = Result.Nodes.getNodeAs<Expr>("redundantExpr"); const auto *OriginalExpr = Result.Nodes.getNodeAs<Expr>("originalStringView"); assert(RedundantExpr && ParamExpr && OriginalExpr); @@ -92,7 +92,10 @@ void StringViewConversionsCheck::check(const MatchFinder::MatchResult &Result) { // Sanity check. Verify that the redundant expression is the direct source of // the argument, not part of a larger expression (e.g., std::string(sv) + // "bar"). - assert(ParamExpr->getSourceRange() == RedundantExpr->getSourceRange()); + // FIXME: This is a temporary solution to avoid assertions. Instead the + // matcher must be fixed. + if (ParamExpr->getSourceRange() != RedundantExpr->getSourceRange()) + return; const StringRef OriginalText = Lexer::getSourceText( CharSourceRange::getTokenRange(OriginalExpr->getSourceRange()), diff --git a/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/string b/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/string index c3fd2cf6c1ff7..7de709d07f2df 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/string +++ b/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/string @@ -27,6 +27,7 @@ struct basic_string { basic_string(const C *p, size_type count); basic_string(const C *b, const C *e); basic_string(size_t, C); + operator basic_string_view<C, T>() const; ~basic_string(); @@ -108,7 +109,6 @@ struct basic_string_view { const C *str; constexpr basic_string_view(const C* s) : str(s) {} - basic_string_view(const basic_string<C, T>&) {} const C *data() const; diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/string-view-conversions-cxx20.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/string-view-conversions-cxx20.cpp index 1a49883dad100..3b7883ec80a56 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/performance/string-view-conversions-cxx20.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/performance/string-view-conversions-cxx20.cpp @@ -14,14 +14,14 @@ void positive(std::string_view sv, std::wstring_view wsv) { // [u8|u16|32]string([u8|u16|32]string_view) // foo_u8sv(42, std::u8string(u8"Hello, world"), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: redundant conversion to 'std::u8string' (aka 'basic_string<char8_t>') and then back to 'std::u8string_view' (aka 'basic_string_view<char8_t>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: redundant conversion to 'std::u8string' (aka 'basic_string<char8_t>') and then back to 'basic_string_view<char8_t, std::char_traits<char8_t>>' [performance-string-view-conversions] // CHECK-FIXES: foo_u8sv(42, u8"Hello, world", 3.14); foo_u16sv(42, std::u16string(u"Hello, world"), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: redundant conversion to 'std::u16string' (aka 'basic_string<char16_t>') and then back to 'std::u16string_view' (aka 'basic_string_view<char16_t>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: redundant conversion to 'std::u16string' (aka 'basic_string<char16_t>') and then back to 'basic_string_view<char16_t, std::char_traits<char16_t>>' [performance-string-view-conversions] // CHECK-FIXES: foo_u16sv(42, u"Hello, world", 3.14); foo_u32sv(42, std::u32string(U"Hello, world"), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: redundant conversion to 'std::u32string' (aka 'basic_string<char32_t>') and then back to 'std::u32string_view' (aka 'basic_string_view<char32_t>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: redundant conversion to 'std::u32string' (aka 'basic_string<char32_t>') and then back to 'basic_string_view<char32_t, std::char_traits<char32_t>>' [performance-string-view-conversions] // CHECK-FIXES: foo_u32sv(42, U"Hello, world", 3.14); } diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/string-view-conversions.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/string-view-conversions.cpp index bfd5521b39d72..69365a064c611 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/performance/string-view-conversions.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/performance/string-view-conversions.cpp @@ -46,52 +46,56 @@ void positive(std::string_view sv, std::wstring_view wsv) { // string(string_view) // foo_sv(42, std::string(sv), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'std::string_view' (aka 'basic_string_view<char>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] // CHECK-FIXES: foo_sv(42, sv, 3.14); foo_sv(42, std::string("Hello, world"), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'std::string_view' (aka 'basic_string_view<char>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] + // CHECK-FIXES: foo_sv(42, "Hello, world", 3.14); + + foo_sv(42, std::string( ( "Hello, world" ) ), 3.14); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] // CHECK-FIXES: foo_sv(42, "Hello, world", 3.14); // TODO: support for ""sv literals foo_sv(42, "Hello, world"s, 3.14); foo_sv(42, std::string{"Hello, world"}, 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'std::string_view' (aka 'basic_string_view<char>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] // CHECK-FIXES: foo_sv(42, "Hello, world", 3.14); const char *ptr = "Hello, world"; foo_sv(42, std::string(ptr), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'std::string_view' (aka 'basic_string_view<char>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] // CHECK-FIXES: foo_sv(42, ptr, 3.14); char arr[] = "Hello, world"; foo_sv(42, std::string(arr), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'std::string_view' (aka 'basic_string_view<char>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] // CHECK-FIXES: foo_sv(42, arr, 3.14); foo_sv(42, std::string(foo_sv(42)), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'std::string_view' (aka 'basic_string_view<char>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] // CHECK-FIXES: foo_sv(42, foo_sv(42), 3.14); std::string s = "hello"; foo_sv(42, std::string(s), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'std::string_view' (aka 'basic_string_view<char>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] // CHECK-FIXES: foo_sv(42, s, 3.14); foo_sv(42, std::string{s}, 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'std::string_view' (aka 'basic_string_view<char>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to 'std::string' (aka 'basic_string<char>') and then back to 'basic_string_view<char, std::char_traits<char>>' [performance-string-view-conversions] // CHECK-FIXES: foo_sv(42, s, 3.14); // wstring(wstring_view) // foo_wsv(42, std::wstring(wsv), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: redundant conversion to 'std::wstring' (aka 'basic_string<wchar_t>') and then back to 'std::wstring_view' (aka 'basic_string_view<wchar_t>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: redundant conversion to 'std::wstring' (aka 'basic_string<wchar_t>') and then back to 'basic_string_view<wchar_t, std::char_traits<wchar_t>>' [performance-string-view-conversions] // CHECK-FIXES: foo_wsv(42, wsv, 3.14); const wchar_t *wptr = L"Hello, world"; foo_wsv(42, std::wstring(wptr), 3.14); - // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: redundant conversion to 'std::wstring' (aka 'basic_string<wchar_t>') and then back to 'std::wstring_view' (aka 'basic_string_view<wchar_t>') [performance-string-view-conversions] + // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: redundant conversion to 'std::wstring' (aka 'basic_string<wchar_t>') and then back to 'basic_string_view<wchar_t, std::char_traits<wchar_t>>' [performance-string-view-conversions] // CHECK-FIXES: foo_wsv(42, wptr, 3.14); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
