https://github.com/zeyi2 created https://github.com/llvm/llvm-project/pull/177345
Closes #176623 >From 2183bfcade6f4c5805e0ab875c4b38ca7079f3ee Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Thu, 22 Jan 2026 19:50:35 +0800 Subject: [PATCH] [clang-tidy] Fix false positive in readability-non-const-parameter for dependent expression --- .../readability/NonConstParameterCheck.cpp | 14 +++++++----- clang-tools-extra/docs/ReleaseNotes.rst | 4 ++++ .../readability/non-const-parameter.cpp | 22 +++++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp b/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp index a8767db4a4ffc..2ecde56cd7af8 100644 --- a/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp @@ -26,11 +26,12 @@ void NonConstParameterCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher(declRefExpr().bind("Ref"), this); // Analyse parameter usage in function. - Finder->addMatcher(stmt(anyOf(unaryOperator(hasAnyOperatorName("++", "--")), - binaryOperator(), callExpr(), returnStmt(), - cxxConstructExpr())) - .bind("Mark"), - this); + Finder->addMatcher( + stmt(anyOf(unaryOperator(hasAnyOperatorName("++", "--")), + binaryOperator(), callExpr(), returnStmt(), cxxConstructExpr(), + cxxUnresolvedConstructExpr())) + .bind("Mark"), + this); Finder->addMatcher(varDecl(hasInitializer(anything())).bind("Mark"), this); } @@ -93,6 +94,9 @@ void NonConstParameterCheck::check(const MatchFinder::MatchResult &Result) { markCanNotBeConst(Arg->IgnoreParenCasts(), false); } } + } else if (const auto *CE = dyn_cast<CXXUnresolvedConstructExpr>(S)) { + for (const auto *Arg : CE->arguments()) + markCanNotBeConst(Arg->IgnoreParenCasts(), true); } else if (const auto *R = dyn_cast<ReturnStmt>(S)) { markCanNotBeConst(R->getRetValue(), true); } else if (const auto *U = dyn_cast<UnaryOperator>(S)) { diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 5af634c77f54d..89639828d0efe 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -137,6 +137,10 @@ Changes in existing checks now uses separate note diagnostics for each uninitialized enumerator, making it easier to see which specific enumerators need explicit initialization. +- Improved :doc:`readability-non-const-parameter + <clang-tidy/checks/readability/non-const-parameter>` check by avoiding false + positives on parameters used in dependent expressions. + Removed checks ^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/non-const-parameter.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/non-const-parameter.cpp index a118c320bdae9..82a7715b63ae7 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/non-const-parameter.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/non-const-parameter.cpp @@ -341,3 +341,25 @@ void constructLVRef(int *p) { // CHECK-MESSAGES-NOT: warning: pointer parameter 'p' can be Temp1 t(*p); } + +template<bool> +class A final { + char* sz_ = {}; + +public: + explicit A(char* sz) noexcept : sz_(sz) {} + void f() { sz_ = {}; } +}; + +class B final { + char* sz_ = {}; + +public: + explicit B(char* sz) noexcept : sz_(sz) {} + void f() { sz_ = {}; } +}; + +void gh176623() { + auto const _ = []<bool tc>(char* p) { auto _ = A<tc>(p); }; + auto const _ = []<bool tc>(char* p) { auto _ = B(p); }; +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
