[clang-tools-extra] WIP: [clang-tidy] Add SmartPtrName to MakeSmartPtrCheck for flexible … (PR #117529)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 25 07:22:32 PST 2024
================
@@ -0,0 +1,142 @@
+// RUN: %check_clang_tidy %s modernize-make-shared %t -- \
+// RUN: -config="{CheckOptions: [{key: modernize-make-shared.MakeSmartPtrType, value: '::base::scoped_refptr'}, \
+// RUN: {key: modernize-make-shared.MakeSmartPtrFunction, value: 'base::MakeRefCounted'}]}" \
+// RUN: -- -std=c++11 -nostdinc++
+
+namespace base {
+
+using nullptr_t = decltype(nullptr);
+
+template <typename T>
+struct remove_extent { typedef T type; };
+
+template <typename T>
+struct remove_reference { typedef T type; };
+
+template <typename T>
+class scoped_refptr {
+public:
+ typedef T element_type;
+ typedef T* pointer;
+ typedef element_type& reference;
+
+ // Default constructors
+ constexpr scoped_refptr() noexcept : ptr_(nullptr) {}
+ constexpr scoped_refptr(nullptr_t) noexcept : ptr_(nullptr) {}
+
+ // Constructors from raw pointer
+ explicit scoped_refptr(T* p) noexcept : ptr_(p) {}
+ scoped_refptr(T* p, bool) noexcept : ptr_(p) {} // Special constructor for temporaries
+
+ // Copy constructors
+ scoped_refptr(const scoped_refptr& r) noexcept : ptr_(r.ptr_) {}
+ template<typename U>
+ scoped_refptr(const scoped_refptr<U>& r) noexcept : ptr_(r.get()) {}
+
+ // Move constructors
+ scoped_refptr(scoped_refptr&& r) noexcept : ptr_(r.ptr_) {
+ r.ptr_ = nullptr;
+ }
+ template<typename U>
+ scoped_refptr(scoped_refptr<U>&& r) noexcept : ptr_(r.get()) {
+ r.reset();
+ }
+
+ // Assignment operators
+ scoped_refptr& operator=(const scoped_refptr& r) noexcept {
+ ptr_ = r.ptr_;
+ return *this;
+ }
+ template<typename U>
+ scoped_refptr& operator=(const scoped_refptr<U>& r) noexcept {
+ ptr_ = r.get();
+ return *this;
+ }
+
+ scoped_refptr& operator=(scoped_refptr&& r) noexcept {
+ ptr_ = r.ptr_;
+ r.ptr_ = nullptr;
+ return *this;
+ }
+ template<typename U>
+ scoped_refptr& operator=(scoped_refptr<U>&& r) noexcept {
+ ptr_ = r.get();
+ r.reset();
+ return *this;
+ }
+
+ void reset(T* p = nullptr) noexcept {
+ ptr_ = p;
+ }
+
+ void swap(scoped_refptr& r) noexcept {
+ T* tmp = ptr_;
+ ptr_ = r.ptr_;
+ r.ptr_ = tmp;
+ }
+
+ // Observers
+ T* get() const noexcept { return ptr_; }
+ T& operator*() const noexcept { return *ptr_; }
+ T* operator->() const noexcept { return ptr_; }
+ explicit operator bool() const noexcept { return ptr_ != nullptr; }
+
+ ~scoped_refptr() { }
+
+private:
+ element_type* ptr_;
+};
+
+// Non-member functions
+template<class T>
+void swap(scoped_refptr<T>& a, scoped_refptr<T>& b) noexcept {
+ a.swap(b);
+}
+
+template<class T, class U>
+bool operator==(const scoped_refptr<T>& a, const scoped_refptr<U>& b) noexcept {
+ return a.get() == b.get();
+}
+
+template<class T>
+bool operator==(const scoped_refptr<T>& a, nullptr_t) noexcept {
+ return !a;
+}
+
+template <typename T, typename... Args>
+scoped_refptr<T> MakeRefCounted(Args&&... args) {
+ return scoped_refptr<T>(new T(args...));
+}
+
+} // namespace base
+
+struct Base {
+ Base() {}
+ Base(int, int) {}
+};
+
+struct Derived : public Base {
+ Derived() {}
+ Derived(int, int) : Base(0, 0) {}
+};
+
+void basic() {
+ // Direct constructor calls - not covered by this check
+ base::scoped_refptr<int> P1(new int());
+ base::scoped_refptr<Base> basePtr(new Base());
+
+ // Reset calls
+ P1.reset(new int());
+ // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use base::MakeRefCounted instead
+ // CHECK-FIXES: P1 = base::MakeRefCounted<int>();
+
+ basePtr.reset(new Derived());
+ // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use base::MakeRefCounted instead
+ // CHECK-FIXES: basePtr = base::MakeRefCounted<Derived>();
+}
+
+base::scoped_refptr<Base> factory() {
+ return base::scoped_refptr<Base>(new Base);
+ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use base::MakeRefCounted instead
+ // CHECK-FIXES: return base::MakeRefCounted<Base>();
+}
----------------
EugeneZelenko wrote:
Please add newline after.
https://github.com/llvm/llvm-project/pull/117529
More information about the cfe-commits
mailing list