1// RUN: %check_clang_tidy %s misc-uniqueptr-reset-release %t
2
3// CHECK-FIXES: #include <utility>
4
5namespace std {
6
7template <typename T>
8struct default_delete {};
9
10template <typename T, class Deleter = std::default_delete<T>>
11struct unique_ptr {
12 unique_ptr();
13 explicit unique_ptr(T *);
14 template <typename U, typename E>
15 unique_ptr(unique_ptr<U, E> &&);
16 void reset(T *);
17 T *release();
18};
19} // namespace std
20
21struct Foo {};
22struct Bar : Foo {};
23
24std::unique_ptr<Foo> Create();
25std::unique_ptr<Foo> &Look();
26std::unique_ptr<Foo> *Get();
27
28using FooFunc = void (*)(Foo *);
29using BarFunc = void (*)(Bar *);
30
31void f() {
32 std::unique_ptr<Foo> a, b;
33 std::unique_ptr<Bar> c;
34 std::unique_ptr<Foo> *x = &a;
35 std::unique_ptr<Foo> *y = &b;
36
37 a.reset(b.release());
38 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer 'unique_ptr<>' assignment over 'release' and 'reset' [misc-uniqueptr-reset-release]
39 // CHECK-FIXES: a = std::move(b);
40 a.reset(c.release());
41 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer 'unique_ptr<>' assignment
42 // CHECK-FIXES: a = std::move(c);
43 a.reset(Create().release());
44 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer 'unique_ptr<>' assignment
45 // CHECK-FIXES: a = Create();
46 x->reset(y->release());
47 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: prefer 'unique_ptr<>' assignment
48 // CHECK-FIXES: *x = std::move(*y);
49 Look().reset(Look().release());
50 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer 'unique_ptr<>' assignment
51 // CHECK-FIXES: Look() = std::move(Look());
52 Get()->reset(Get()->release());
53 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer 'unique_ptr<>' assignment
54 // CHECK-FIXES: *Get() = std::move(*Get());
55
56 std::unique_ptr<Bar, FooFunc> func_a, func_b;
57 func_a.reset(func_b.release());
58 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer 'unique_ptr<>' assignment
59 // CHECK-FIXES: func_a = std::move(func_b);
60}
61
62void negatives() {
63 std::unique_ptr<Foo> src;
64 struct OtherDeleter {};
65 std::unique_ptr<Foo, OtherDeleter> dest;
66 dest.reset(src.release());
67
68 std::unique_ptr<Bar, FooFunc> func_a;
69 std::unique_ptr<Bar, BarFunc> func_b;
70 func_a.reset(func_b.release());
71}
72

source code of clang-tools-extra/test/clang-tidy/checkers/misc/uniqueptr-reset-release.cpp