| // RUN: %check_clang_tidy %s zircon-fbl-memory %t -- -- -isystem %S/Inputs/zircon |
| |
| #include <fbl/unique_ptr.h> |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: including fbl/unique_ptr.h is deprecated |
| // CHECK-FIXES-NOT: #include <fbl/unique_ptr.h> |
| // CHECK-FIXES: #include <memory> |
| |
| namespace fbl { |
| |
| template <typename T> |
| class unique_ptr { |
| public: |
| explicit unique_ptr(T* t) { } |
| }; |
| |
| template <typename T> |
| class unique_ptr<T[]> { |
| public: |
| explicit unique_ptr(T* t) { } |
| }; |
| |
| template <typename T> |
| struct unique_type { |
| using single = unique_ptr<T>; |
| }; |
| |
| template <typename T> |
| struct unique_type<T[]> { |
| using incomplete_array = unique_ptr<T[]>; |
| }; |
| |
| template <typename T> struct remove_extent { using type = T; }; |
| |
| template <typename T> struct remove_extent<T[]> { using type = T; }; |
| |
| // Constructs a new object and assigns it to a unique_ptr. |
| template <typename T, typename... Args> |
| typename unique_type<T>::single make_unique(Args &&... args) { |
| return unique_ptr<T>(new T()); |
| } |
| |
| template <typename T, typename... Args> |
| typename unique_type<T>::incomplete_array make_unique(int size) { |
| using single_type = typename remove_extent<T>::type; |
| return unique_ptr<single_type[]>(new single_type[size]()); |
| } |
| |
| } // namespace fbl |
| |
| namespace std { |
| template <class T> |
| struct default_delete {}; |
| |
| template <class T> struct default_delete<T[]> {}; |
| |
| template <class T, class D = default_delete<T> > class unique_ptr { |
| public: |
| explicit unique_ptr(T *t) {} |
| }; |
| |
| template <class T, class D> class unique_ptr<T[], D> { |
| public: |
| explicit unique_ptr(T *t) {} |
| }; |
| |
| template <class _Tp> struct __unique_if { |
| typedef unique_ptr<_Tp> __unique_single; |
| }; |
| |
| template <class _Tp> struct __unique_if<_Tp[]> { |
| typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; |
| }; |
| |
| template<class _Tp, int _Np> |
| struct __unique_if<_Tp[_Np]> |
| { |
| typedef void __unique_array_known_bound; |
| }; |
| |
| template <class _Tp> struct remove_extent |
| {typedef _Tp type;}; |
| template <class _Tp> struct remove_extent<_Tp[]> |
| {typedef _Tp type;}; |
| template <class _Tp, int _Np> struct remove_extent<_Tp[_Np]> |
| {typedef _Tp type;}; |
| |
| template<class _Tp, class... _Args> |
| typename __unique_if<_Tp>::__unique_single |
| make_unique(_Args&&... __args) |
| { |
| return unique_ptr<_Tp>(new _Tp()); |
| } |
| |
| template<class _Tp> |
| typename __unique_if<_Tp>::__unique_array_unknown_bound |
| make_unique(int __n) |
| { |
| typedef typename remove_extent<_Tp>::type _Up; |
| return unique_ptr<_Tp>(new _Up[__n]()); |
| } |
| |
| } // namespace std |
| |
| int main() { |
| fbl::unique_ptr<int> a = fbl::make_unique<int>(); |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use of fbl::unique_ptr is deprecated, use std::unique_ptr instead |
| // CHECK-MESSAGES: :[[@LINE-2]]:28: warning: use of fbl::make_unique is deprecated, use std::make_unique instead |
| // CHECK-FIXES: std::unique_ptr<int> a = std::make_unique<int>(); |
| std::unique_ptr<int> b = std::make_unique<int>(); |
| |
| auto c = fbl::make_unique<int>(); |
| // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use of fbl::make_unique is deprecated, use std::make_unique instead |
| // CHECK-FIXES: auto d = std::make_unique<int>(); |
| auto d = std::make_unique<int>(); |
| } |