llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra Author: Clement Courbet (legrosbuffle) <details> <summary>Changes</summary> This provides a way to inform the check that we're intending to use an the forwarding reference as a specific reference category Fixes #<!-- -->99474. --- Full diff: https://github.com/llvm/llvm-project/pull/99477.diff 4 Files Affected: - (modified) clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp (+6-2) - (modified) clang-tools-extra/docs/ReleaseNotes.rst (+5) - (modified) clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/missing-std-forward.rst (+3) - (modified) clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward.cpp (+17) ``````````diff diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp index bbb35228ce47f..726e9fffc628b 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp @@ -129,6 +129,9 @@ void MissingStdForwardCheck::registerMatchers(MatchFinder *Finder) { unless(anyOf(hasAncestor(typeLoc()), hasAncestor(expr(hasUnevaluatedContext()))))); + auto StaticCast = cxxStaticCastExpr( + hasSourceExpression(declRefExpr(to(equalsBoundNode("param"))))); + Finder->addMatcher( parmVarDecl( parmVarDecl().bind("param"), hasIdentifier(), @@ -136,8 +139,9 @@ void MissingStdForwardCheck::registerMatchers(MatchFinder *Finder) { hasAncestor(functionDecl().bind("func")), hasAncestor(functionDecl( isDefinition(), equalsBoundNode("func"), ToParam, - unless(anyOf(isDeleted(), - hasDescendant(std::move(ForwardCallMatcher))))))), + unless(anyOf(isDeleted(), hasDescendant(expr( + anyOf(std::move(ForwardCallMatcher), + std::move(StaticCast))))))))), this); } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index a23483e6df6d2..c3f41811fa7d7 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -518,6 +518,11 @@ Changes in existing checks usages of ``std::string_view::compare``. Added a `StringLikeClasses` option to detect usages of ``compare`` method in custom string-like classes. +- Improved :doc:`cppcoreguidelines-missing-std-forward + <clang-tidy/checks/cppcoreguidelines/missing-std-forward>` check to allow + using ``static_cast<T&>`` to explicitly convey the intention of using a + forwarding reference as an lvalue reference. + Removed checks ^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/missing-std-forward.rst b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/missing-std-forward.rst index 0c311b59a5d5a..12765b45088de 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/missing-std-forward.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/missing-std-forward.rst @@ -38,3 +38,6 @@ Example: This check implements `F.19 <http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-forward>`_ from the C++ Core Guidelines. + +Users who want to use the forwarding reference as an lvalue reference can convey +the intention by using ``static_cast<T&>(t)``. 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 8116db58c937d..519d2822948bb 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 @@ -211,3 +211,20 @@ template<typename F> void unused_argument3(F&& _) {} } // namespace unused_arguments + +namespace escape_hatch { + +template<typename T> +void used_as_lvalue_on_purpose(T&& t) { + static_cast<T&>(t); + static_cast<const T&>(t); +} + +template<typename T> +void used_as_rvalue_on_purpose(T&& t) { + static_cast<const T&&>(t); + // Typically used as another spelling for `std::forward`. + static_cast<T&&>(t); +} + +} `````````` </details> https://github.com/llvm/llvm-project/pull/99477 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits