Author: Fabian Wolff Date: 2023-08-09T00:55:45+02:00 New Revision: 5b95d17da1f0719f0af711e032d36b18fcb92070
URL: https://github.com/llvm/llvm-project/commit/5b95d17da1f0719f0af711e032d36b18fcb92070 DIFF: https://github.com/llvm/llvm-project/commit/5b95d17da1f0719f0af711e032d36b18fcb92070.diff LOG: [clang-tidy] `performance-faster-string-find` generates incorrect fixes for single quote character literals Reviewed By: PiotrZSL Differential Revision: https://reviews.llvm.org/D157436 Added: Modified: clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-find.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp b/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp index d932b5fb936cb2..ca4f6ad409b08c 100644 --- a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp @@ -26,14 +26,20 @@ std::optional<std::string> makeCharacterLiteral(const StringLiteral *Literal) { Literal->outputString(OS); } // Now replace the " with '. - auto Pos = Result.find_first_of('"'); - if (Pos == Result.npos) + auto OpenPos = Result.find_first_of('"'); + if (OpenPos == Result.npos) return std::nullopt; - Result[Pos] = '\''; - Pos = Result.find_last_of('"'); - if (Pos == Result.npos) + Result[OpenPos] = '\''; + + auto ClosePos = Result.find_last_of('"'); + if (ClosePos == Result.npos) return std::nullopt; - Result[Pos] = '\''; + Result[ClosePos] = '\''; + + // "'" is OK, but ''' is not, so add a backslash + if ((ClosePos - OpenPos) == 2 && Result[OpenPos + 1] == '\'') + Result.replace(OpenPos + 1, 1, "\\'"); + return Result; } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 78d3dab48f5306..c4b09bae18ec37 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -188,6 +188,10 @@ Changes in existing checks <clang-tidy/checks/modernize/loop-convert>` to support for-loops with iterators initialized by free functions like ``begin``, ``end``, or ``size``. +- Improved :doc:`performance-faster-string-find + <clang-tidy/checks/performance/faster-string-find>` check to properly escape + single quotes. + - Improved :doc:`performanc-noexcept-swap <clang-tidy/checks/performance/noexcept-swap>` check to enforce a stricter match with the swap function signature, eliminating false-positives. diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-find.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-find.cpp index dc625024fd1bc9..b50d175cff3b70 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-find.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-find.cpp @@ -56,13 +56,21 @@ void StringFind() { // CHECK-MESSAGES: [[@LINE-1]]:12: warning: 'find' called with a string literal // CHECK-FIXES: Str.find('a', 1); - // Doens't work with strings smaller or larger than 1 char. + // Doesn't work with strings smaller or larger than 1 char. Str.find(""); Str.find("ab"); // Doesn't do anything with the 3 argument overload. Str.find("a", 1, 1); + // Single quotes are escaped properly + Str.find("'"); + // CHECK-MESSAGES: [[@LINE-1]]:12: warning: 'find' called with a string literal + // CHECK-FIXES: Str.find('\''); + Str.find("\'"); + // CHECK-MESSAGES: [[@LINE-1]]:12: warning: 'find' called with a string literal + // CHECK-FIXES: Str.find('\''); + // Other methods that can also be replaced Str.rfind("a"); // CHECK-MESSAGES: [[@LINE-1]]:13: warning: 'rfind' called with a string literal _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits