| // RUN: %check_clang_tidy %s misc-uniqueptr-reset-release %t |
| |
| namespace std { |
| |
| template <typename T> |
| struct default_delete {}; |
| |
| template <typename T, class Deleter = std::default_delete<T>> |
| struct unique_ptr { |
| unique_ptr(); |
| explicit unique_ptr(T *); |
| template <typename U, typename E> |
| unique_ptr(unique_ptr<U, E> &&); |
| void reset(T *); |
| T *release(); |
| }; |
| } // namespace std |
| |
| struct Foo {}; |
| struct Bar : Foo {}; |
| |
| std::unique_ptr<Foo> Create(); |
| std::unique_ptr<Foo> &Look(); |
| std::unique_ptr<Foo> *Get(); |
| |
| using FooFunc = void (*)(Foo *); |
| using BarFunc = void (*)(Bar *); |
| |
| void f() { |
| std::unique_ptr<Foo> a, b; |
| std::unique_ptr<Bar> c; |
| std::unique_ptr<Foo> *x = &a; |
| std::unique_ptr<Foo> *y = &b; |
| |
| a.reset(b.release()); |
| // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer ptr1 = std::move(ptr2) over ptr1.reset(ptr2.release()) [misc-uniqueptr-reset-release] |
| // CHECK-FIXES: a = std::move(b); |
| a.reset(c.release()); |
| // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer ptr1 = std::move(ptr2) |
| // CHECK-FIXES: a = std::move(c); |
| a.reset(Create().release()); |
| // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer ptr = ReturnUnique() over ptr.reset(ReturnUnique().release()) [misc-uniqueptr-reset-release] |
| // CHECK-FIXES: a = Create(); |
| x->reset(y->release()); |
| // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: prefer ptr1 = std::move(ptr2) |
| // CHECK-FIXES: *x = std::move(*y); |
| Look().reset(Look().release()); |
| // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer ptr1 = std::move(ptr2) |
| // CHECK-FIXES: Look() = std::move(Look()); |
| Get()->reset(Get()->release()); |
| // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer ptr1 = std::move(ptr2) |
| // CHECK-FIXES: *Get() = std::move(*Get()); |
| |
| std::unique_ptr<Bar, FooFunc> func_a, func_b; |
| func_a.reset(func_b.release()); |
| // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer ptr1 = std::move(ptr2) |
| // CHECK-FIXES: func_a = std::move(func_b); |
| } |
| |
| void negatives() { |
| std::unique_ptr<Foo> src; |
| struct OtherDeleter {}; |
| std::unique_ptr<Foo, OtherDeleter> dest; |
| dest.reset(src.release()); |
| |
| std::unique_ptr<Bar, FooFunc> func_a; |
| std::unique_ptr<Bar, BarFunc> func_b; |
| func_a.reset(func_b.release()); |
| } |