blob: aa8ae25944e462a752f7a1d22dc440d34d2c4849 [file] [log] [blame]
Manuel Klimekb91bee02015-10-22 11:31:44 +00001// RUN: %check_clang_tidy %s readability-uniqueptr-delete-release %t
Samuel Benzaquendaef1632015-10-19 21:49:51 +00002
3namespace std {
4template <typename T>
5struct default_delete {};
6
7template <typename T, typename D = default_delete<T>>
8class unique_ptr {
9 public:
10 unique_ptr();
11 ~unique_ptr();
12 explicit unique_ptr(T*);
13 template <typename U, typename E>
14 unique_ptr(unique_ptr<U, E>&&);
15 T* release();
16};
17} // namespace std
18
19std::unique_ptr<int>& ReturnsAUnique();
20
21void Positives() {
22 std::unique_ptr<int> P;
23 delete P.release();
24 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: prefer '= nullptr' to 'delete x.release()' to reset unique_ptr<> objects [readability-uniqueptr-delete-release]
25 // CHECK-FIXES: {{^}} P = nullptr;
26
27 std::unique_ptr<int> Array[20];
28 delete Array[4].release();
29 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: prefer '= nullptr' to 'delete
30 // CHECK-FIXES: {{^}} Array[4] = nullptr;
31
32 delete ReturnsAUnique().release();
33 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: prefer '= nullptr' to 'delete
34 // CHECK-FIXES: {{^}} ReturnsAUnique() = nullptr;
35}
36
37struct NotDefaultDeleter {};
38
39struct NotUniquePtr {
40 int* release();
41};
42
43void Negatives() {
44 std::unique_ptr<int, NotDefaultDeleter> P;
45 delete P.release();
46
47 NotUniquePtr P2;
48 delete P2.release();
49}
50
51template <typename T, typename D>
52void NegativeDeleterT() {
53 // Ideally this would trigger a warning, but we have all dependent types
54 // disabled for now.
55 std::unique_ptr<T> P;
56 delete P.release();
57
58 // We ignore this one because the deleter is a template argument.
59 // Not all instantiations will use the default deleter.
60 std::unique_ptr<int, D> P2;
61 delete P2.release();
62}
63template void NegativeDeleterT<int, std::default_delete<int>>();
64
65// Test some macros
66
67#define DELETE_RELEASE(x) delete (x).release()
68void NegativesWithTemplate() {
69 std::unique_ptr<int> P;
70 DELETE_RELEASE(P);
71}