https://github.com/PiotrZSL created https://github.com/llvm/llvm-project/pull/70600
Improved modernize-make-shared check to support std::shared_ptr implementations that inherit the reset method from a base class. In GCC that class is called __shared_ptr. Fixes #64481 >From 79c01dbf330cd3489ee8ac1dd284c80eacebce85 Mon Sep 17 00:00:00 2001 From: Piotr Zegar <m...@piotrzegar.pl> Date: Sun, 29 Oct 2023 19:21:23 +0000 Subject: [PATCH] [clang-tidy] Improve modernize-make-shared check Improved modernize-make-shared check to support std::shared_ptr implementations that inherit the reset method from a base class. In GCC that class is called __shared_ptr. --- .../modernize/MakeSmartPtrCheck.cpp | 20 ++++++++------ clang-tools-extra/docs/ReleaseNotes.rst | 5 ++++ .../modernize/Inputs/smart-ptr/shared_ptr.h | 27 ++++++++++++------- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp index 2f9f47d3f6c3e85..71fd8eca300c1b2 100644 --- a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -96,14 +96,18 @@ void MakeSmartPtrCheck::registerMatchers(ast_matchers::MatchFinder *Finder) { this); Finder->addMatcher( - traverse(TK_AsIs, - cxxMemberCallExpr( - thisPointerType(getSmartPointerTypeMatcher()), - callee(cxxMethodDecl(hasName("reset"))), - hasArgument(0, cxxNewExpr(CanCallCtor, unless(IsPlacement)) - .bind(NewExpression)), - unless(isInTemplateInstantiation())) - .bind(ResetCall)), + traverse( + TK_AsIs, + cxxMemberCallExpr( + unless(isInTemplateInstantiation()), + hasArgument(0, cxxNewExpr(CanCallCtor, unless(IsPlacement)) + .bind(NewExpression)), + callee(cxxMethodDecl(hasName("reset"))), + anyOf(thisPointerType(getSmartPointerTypeMatcher()), + on(ignoringImplicit(anyOf( + hasType(getSmartPointerTypeMatcher()), + hasType(pointsTo(getSmartPointerTypeMatcher()))))))) + .bind(ResetCall)), this); } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 5ce38ab48bf295f..2a755e9b75aa739 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -331,6 +331,11 @@ Changes in existing checks iterators initialized by free functions like ``begin``, ``end``, or ``size`` and avoid crash for array of dependent array. +- Improved :doc:`modernize-make-shared + <clang-tidy/checks/modernize/make-shared>` check to support + ``std::shared_ptr`` implementations that inherit the ``reset`` method from a + base class. + - Improved :doc:`modernize-return-braced-init-list <clang-tidy/checks/modernize/return-braced-init-list>` check to ignore false-positives when constructing the container with ``count`` copies of diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/smart-ptr/shared_ptr.h b/clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/smart-ptr/shared_ptr.h index 0f4f2a97095b56f..337cb28228b09c4 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/smart-ptr/shared_ptr.h +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/smart-ptr/shared_ptr.h @@ -1,24 +1,33 @@ namespace std { template <typename type> -class shared_ptr { +class __shared_ptr { +protected: + __shared_ptr(); + __shared_ptr(type *ptr); + ~__shared_ptr(); public: - shared_ptr(); - shared_ptr(type *ptr); - shared_ptr(const shared_ptr<type> &t) {} - shared_ptr(shared_ptr<type> &&t) {} - ~shared_ptr(); type &operator*() { return *ptr; } type *operator->() { return ptr; } type *release(); void reset(); void reset(type *pt); - shared_ptr &operator=(shared_ptr &&); - template <typename T> - shared_ptr &operator=(shared_ptr<T> &&); private: type *ptr; }; +template <typename type> +class shared_ptr : public __shared_ptr<type> { +public: + shared_ptr(); + shared_ptr(type *ptr); + shared_ptr(const shared_ptr<type> &t); + shared_ptr(shared_ptr<type> &&t); + ~shared_ptr(); + shared_ptr &operator=(shared_ptr &&); + template <typename T> + shared_ptr &operator=(shared_ptr<T> &&); +}; + } // namespace std _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits