https://github.com/vbvictor created https://github.com/llvm/llvm-project/pull/190522
None >From 704491133901a0014eb7e45dc4137b0e582b2632 Mon Sep 17 00:00:00 2001 From: Victor Baranov <[email protected]> Date: Sun, 5 Apr 2026 16:30:26 +0300 Subject: [PATCH] [clang-tidy] Fix FP in cppcoreguidelines-missing-std-forward in lambda init-list --- .../MissingStdForwardCheck.cpp | 10 ++++++--- clang-tools-extra/docs/ReleaseNotes.rst | 8 +++++-- .../cppcoreguidelines/missing-std-forward.cpp | 22 +++++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp index 3fda2a671eaf4..29218d6ba0565 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp @@ -112,8 +112,10 @@ void MissingStdForwardCheck::registerMatchers(MatchFinder *Finder) { allOf(hasCaptureKind(LambdaCaptureKind::LCK_ByRef), RefToParm)); auto CapturedInBody = lambdaExpr(anyOf(CaptureInRef, CaptureByRefExplicit)); - auto CapturedInCaptureList = hasAnyCapture(capturesVar( - varDecl(hasInitializer(ignoringParenImpCasts(equalsBoundNode("call")))))); + auto IsBoundCall = ignoringParenImpCasts(equalsBoundNode("call")); + auto CapturedInCaptureList = hasAnyCapture(capturesVar(varDecl( + hasInitializer(anyOf(IsBoundCall, initListExpr(hasInit(0, IsBoundCall)), + parenListExpr(has(expr(IsBoundCall)))))))); auto CapturedInLambda = hasDeclContext(cxxRecordDecl( isLambda(), @@ -143,7 +145,9 @@ void MissingStdForwardCheck::registerMatchers(MatchFinder *Finder) { hasAncestor(functionDecl().bind("func")), hasAncestor(functionDecl( isDefinition(), equalsBoundNode("func"), ToParam, - unless(anyOf(isDeleted(), hasDescendant(ForwardCallMatcher)))))), + unless(anyOf( + isDeleted(), + traverse(TK_AsIs, hasDescendant(ForwardCallMatcher))))))), this); } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 69dc5b9633398..ac0c2cff89932 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -280,8 +280,12 @@ Changes in existing checks member pointers are correctly flagged as uninitialized. - Improved :doc:`cppcoreguidelines-missing-std-forward - <clang-tidy/checks/cppcoreguidelines/missing-std-forward>` check by fixing - a false positive for constrained template parameters. + <clang-tidy/checks/cppcoreguidelines/missing-std-forward>` check: + + - Fixed false positive for constrained template parameters + + - Fixed false positive with ``std::forward`` in brace-init and paren-init + lambda captures such as ``[t{std::forward<T>(t)}]``. - Improved :doc:`cppcoreguidelines-pro-type-vararg <clang-tidy/checks/cppcoreguidelines/pro-type-vararg>` check by no longer diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward.cpp index d8aa78af43c9f..dbb40b77f2dca 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward.cpp @@ -81,6 +81,18 @@ void lambda_value_capture_copy(T&& t) { [&,t]() { T other = std::forward<T>(t); }; } +template <class T> +void lambda_capture_list_brace_init_no_forward(T&& t) { + // CHECK-MESSAGES: :[[@LINE-1]]:52: warning: forwarding reference parameter 't' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward] + [t2{t}] { t2(); }; +} + +template <class T> +void lambda_capture_list_paren_init_no_forward(T&& t) { + // CHECK-MESSAGES: :[[@LINE-1]]:52: warning: forwarding reference parameter 't' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward] + [t2(t)] { t2(); }; +} + template <typename X> void use(const X &x) {} @@ -168,6 +180,16 @@ void lambda_value_reference_auxiliary_var(T&& t) { [&x = t]() { T other = std::forward<T>(x); }; } +template <typename T> +void lambda_value_reference_capture_list_brace_init(T&& t) { + [t2{std::forward<T>(t)}] { t2(); }; +} + +template <typename T> +void lambda_value_reference_capture_list_paren_init(T&& t) { + [t2(std::forward<T>(t))] { t2(); }; +} + } // namespace negative_cases namespace deleted_functions { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
