// RUN: %check_clang_tidy %s misc-uniqueptr-reset-release %t namespace std { template struct default_delete {}; template > struct unique_ptr { unique_ptr(); explicit unique_ptr(T *); template unique_ptr(unique_ptr &&); void reset(T *); T *release(); }; } // namespace std struct Foo {}; struct Bar : Foo {}; std::unique_ptr Create(); std::unique_ptr &Look(); std::unique_ptr *Get(); using FooFunc = void (*)(Foo *); using BarFunc = void (*)(Bar *); void f() { std::unique_ptr a, b; std::unique_ptr c; std::unique_ptr *x = &a; std::unique_ptr *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 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 src; struct OtherDeleter {}; std::unique_ptr dest; dest.reset(src.release()); std::unique_ptr func_a; std::unique_ptr func_b; func_a.reset(func_b.release()); }