|  | // RUN: %check_clang_tidy %s readability-uniqueptr-delete-release %t | 
|  |  | 
|  | namespace std { | 
|  | template <typename T> | 
|  | struct default_delete {}; | 
|  |  | 
|  | template <typename T, typename D = default_delete<T>> | 
|  | class unique_ptr { | 
|  | public: | 
|  | unique_ptr(); | 
|  | ~unique_ptr(); | 
|  | explicit unique_ptr(T*); | 
|  | template <typename U, typename E> | 
|  | unique_ptr(unique_ptr<U, E>&&); | 
|  | T* release(); | 
|  | }; | 
|  | }  // namespace std | 
|  |  | 
|  | std::unique_ptr<int>& ReturnsAUnique(); | 
|  |  | 
|  | void Positives() { | 
|  | std::unique_ptr<int> P; | 
|  | delete P.release(); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: prefer '= nullptr' to 'delete x.release()' to reset unique_ptr<> objects [readability-uniqueptr-delete-release] | 
|  | // CHECK-FIXES: {{^}}  P = nullptr; | 
|  |  | 
|  | auto P2 = P; | 
|  | delete P2.release(); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: prefer '= nullptr' to 'delete x.release()' to reset unique_ptr<> objects [readability-uniqueptr-delete-release] | 
|  | // CHECK-FIXES: {{^}}  P2 = nullptr; | 
|  |  | 
|  | std::unique_ptr<int> Array[20]; | 
|  | delete Array[4].release(); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: prefer '= nullptr' to 'delete | 
|  | // CHECK-FIXES: {{^}}  Array[4] = nullptr; | 
|  |  | 
|  | delete ReturnsAUnique().release(); | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: prefer '= nullptr' to 'delete | 
|  | // CHECK-FIXES: {{^}}  ReturnsAUnique() = nullptr; | 
|  | } | 
|  |  | 
|  | struct NotDefaultDeleter {}; | 
|  |  | 
|  | struct NotUniquePtr { | 
|  | int* release(); | 
|  | }; | 
|  |  | 
|  | void Negatives() { | 
|  | std::unique_ptr<int, NotDefaultDeleter> P; | 
|  | delete P.release(); | 
|  |  | 
|  | NotUniquePtr P2; | 
|  | delete P2.release(); | 
|  | } | 
|  |  | 
|  | template <typename T, typename D> | 
|  | void NegativeDeleterT() { | 
|  | // Ideally this would trigger a warning, but we have all dependent types | 
|  | // disabled for now. | 
|  | std::unique_ptr<T> P; | 
|  | delete P.release(); | 
|  |  | 
|  | // We ignore this one because the deleter is a template argument. | 
|  | // Not all instantiations will use the default deleter. | 
|  | std::unique_ptr<int, D> P2; | 
|  | delete P2.release(); | 
|  | } | 
|  | template void NegativeDeleterT<int, std::default_delete<int>>(); | 
|  |  | 
|  | // Test some macros | 
|  |  | 
|  | #define DELETE_RELEASE(x) delete (x).release() | 
|  | void NegativesWithTemplate() { | 
|  | std::unique_ptr<int> P; | 
|  | DELETE_RELEASE(P); | 
|  | } |