0
0
mirror of https://github.com/llvm/llvm-project.git synced 2025-04-21 13:46:49 +00:00

[clang-tidy] Fix invalid fixit from modernize-use-ranges for nullptr used with std::unique_ptr ()

This PR fixes issue  by correcting the handling of `nullptr` with
`std::unique_ptr` in the `modernize-use-ranges` check.

Updated the logic to suppress warnings for `nullptr` in `std::find`.
This commit is contained in:
Andrewyuan34 2025-03-09 08:09:59 -04:00 committed by GitHub
parent 22a45c43db
commit 2a3e782f40
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 40 additions and 3 deletions
clang-tools-extra
clang-tidy/utils
docs
test/clang-tidy/checkers/modernize

@ -215,6 +215,19 @@ void UseRangesCheck::check(const MatchFinder::MatchResult &Result) {
const auto *Call = Result.Nodes.getNodeAs<CallExpr>(Buffer);
if (!Call)
continue;
// FIXME: This check specifically handles `CXXNullPtrLiteralExpr`, but
// a more general solution might be needed.
if (Function->getName() == "find") {
const unsigned ValueArgIndex = 2;
if (Call->getNumArgs() <= ValueArgIndex)
continue;
const Expr *ValueExpr =
Call->getArg(ValueArgIndex)->IgnoreParenImpCasts();
if (isa<CXXNullPtrLiteralExpr>(ValueExpr))
return;
}
auto Diag = createDiag(*Call);
if (auto ReplaceName = Replacer->getReplaceName(*Function))
Diag << FixItHint::CreateReplacement(Call->getCallee()->getSourceRange(),

@ -131,6 +131,10 @@ Changes in existing checks
- Improved :doc:`misc-redundant-expression
<clang-tidy/checks/misc/redundant-expression>` check by providing additional
examples and fixing some macro related false positives.
- Improved :doc:`modernize-use-ranges
<clang-tidy/checks/modernize/use-ranges>` check by updating suppress
warnings logic for ``nullptr`` in ``std::find``.
- Improved :doc:`misc-use-internal-linkage
<clang-tidy/checks/misc/use-internal-linkage>` check by fix false positives

@ -1,14 +1,25 @@
// RUN: %check_clang_tidy -std=c++20 %s modernize-use-ranges %t -- -- -I %S/Inputs/use-ranges/
// RUN: %check_clang_tidy -std=c++23 %s modernize-use-ranges %t -check-suffixes=,CPP23 -- -I %S/Inputs/use-ranges/
// RUN: %check_clang_tidy -std=c++20 %s modernize-use-ranges %t -- -- -I %S/Inputs/
// RUN: %check_clang_tidy -std=c++23 %s modernize-use-ranges %t -check-suffixes=,CPP23 -- -I %S/Inputs/
// Example: ./check_clang_tidy.py -std=c++20 checkers/modernize/use-ranges.cpp modernize-use-ranges temp.txt -- -- -I ~/llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/
// CHECK-FIXES: #include <algorithm>
// CHECK-FIXES-CPP23: #include <numeric>
// CHECK-FIXES: #include <ranges>
#include "fake_std.h"
#include "use-ranges/fake_std.h"
#include "smart-ptr/unique_ptr.h"
void Positives() {
std::vector<int> I, J;
std::vector<std::unique_ptr<int>> K;
// Expect to have no check messages
std::find(K.begin(), K.end(), nullptr);
std::find(K.begin(), K.end(), std::unique_ptr<int>());
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm
// CHECK-FIXES: std::ranges::find(K, std::unique_ptr<int>());
std::find(I.begin(), I.end(), 0);
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm
// CHECK-FIXES: std::ranges::find(I, 0);
@ -76,6 +87,15 @@ void Positives() {
void Reverse(){
std::vector<int> I, J;
std::vector<std::unique_ptr<int>> K;
// Expect to have no check messages
std::find(K.rbegin(), K.rend(), nullptr);
std::find(K.rbegin(), K.rend(), std::unique_ptr<int>());
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm
// CHECK-FIXES: std::ranges::find(std::ranges::reverse_view(K), std::unique_ptr<int>());
std::find(I.rbegin(), I.rend(), 0);
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm
// CHECK-FIXES: std::ranges::find(std::ranges::reverse_view(I), 0);