// RUN: %check_clang_tidy %s modernize-replace-auto-ptr %t -- -- -I %S/Inputs/modernize-replace-auto-ptr // CHECK-FIXES: #include #include "memory.h" // Instrumentation for auto_ptr_ref test. struct Base {}; struct Derived : Base {}; std::auto_ptr create_derived_ptr(); // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: auto_ptr is deprecated, use unique_ptr instead [modernize-replace-auto-ptr] // CHECK-FIXES: std::unique_ptr create_derived_ptr(); // Test function return values (declaration) std::auto_ptr f_5(); // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr f_5() // Test function parameters. void f_6(std::auto_ptr); // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: auto_ptr is deprecated // CHECK-FIXES: void f_6(std::unique_ptr); void f_7(const std::auto_ptr &); // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: auto_ptr is deprecated // CHECK-FIXES: void f_7(const std::unique_ptr &); // Test on record type fields. struct A { std::auto_ptr field; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr field; typedef std::auto_ptr int_ptr_type; // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: auto_ptr is deprecated // CHECK-FIXES: typedef std::unique_ptr int_ptr_type; }; // FIXME: Test template WITH instantiation. template struct B { typedef typename std::auto_ptr created_type; // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: auto_ptr is deprecated // CHECK-FIXES: typedef typename std::unique_ptr created_type; created_type create() { return std::auto_ptr(new T()); } // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: auto_ptr is deprecated // CHECK-FIXES: created_type create() { return std::unique_ptr(new T()); } }; // Test 'using' in a namespace (declaration) namespace ns_1 { // Test multiple using declarations. using std::auto_ptr; // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: auto_ptr is deprecated // CHECK-FIXES: using std::unique_ptr; using std::auto_ptr; // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: auto_ptr is deprecated // CHECK-FIXES: using std::unique_ptr; } namespace ns_2 { template struct auto_ptr {}; } void f_1() { std::auto_ptr a; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr a; // Check that spaces aren't modified unnecessarily. std:: auto_ptr b; // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: auto_ptr is deprecated // CHECK-FIXES: std:: unique_ptr b; std :: auto_ptr < char > c(new char()); // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: auto_ptr is deprecated // CHECK-FIXES: std :: unique_ptr < char > c(new char()); // Test construction from a temporary. std::auto_ptr d = std::auto_ptr(); // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-MESSAGES: :[[@LINE-2]]:32: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr d = std::unique_ptr(); typedef std::auto_ptr int_ptr_t; // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: auto_ptr is deprecated // CHECK-FIXES: typedef std::unique_ptr int_ptr_t; int_ptr_t e(new int()); // Test pointers. std::auto_ptr *f; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr *f; // Test 'static' declarations. static std::auto_ptr g; // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: auto_ptr is deprecated // CHECK-FIXES: static std::unique_ptr g; // Test with cv-qualifiers. const std::auto_ptr h; // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: auto_ptr is deprecated // CHECK-FIXES: const std::unique_ptr h; volatile std::auto_ptr i; // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: auto_ptr is deprecated // CHECK-FIXES: volatile std::unique_ptr i; const volatile std::auto_ptr j; // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: auto_ptr is deprecated // CHECK-FIXES: const volatile std::unique_ptr j; // Test auto and initializer-list. auto k = std::auto_ptr{}; // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: auto_ptr is deprecated // CHECK-FIXES: auto k = std::unique_ptr{}; std::auto_ptr l{std::auto_ptr()}; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-MESSAGES: :[[@LINE-2]]:29: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr l{std::unique_ptr()}; // Test interlocked auto_ptr. std::auto_ptr > m; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr > m; // Test temporaries. std::auto_ptr(); // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr(); // Test void-specialization. std::auto_ptr n; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr n; // Test template WITH instantiation (instantiation). B o; std::auto_ptr p(o.create()); // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr p(o.create()); // Test 'using' in a namespace ("definition"). ns_1::auto_ptr q; // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: auto_ptr is deprecated // CHECK-FIXES: ns_1::unique_ptr q; // Test construction with an 'auto_ptr_ref'. std::auto_ptr r(create_derived_ptr()); // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr r(create_derived_ptr()); } // Test without the nested name specifiers. void f_2() { using namespace std; auto_ptr a; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: auto_ptr is deprecated // CHECK-FIXES: unique_ptr a; } // Test using declaration. void f_3() { using std::auto_ptr; // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: auto_ptr is deprecated // CHECK-FIXES: using std::unique_ptr; auto_ptr a; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: auto_ptr is deprecated // CHECK-FIXES: unique_ptr a; } // Test messing-up with macros. void f_4() { #define MACRO_1 std::auto_ptr MACRO_1 p(new char()); // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr MACRO_1 p(new char()); #define MACRO_2 auto_ptr // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: auto_ptr is deprecated // CHECK-FIXES: #define MACRO_2 unique_ptr std::MACRO_2 q; #define MACRO_3(Type) std::auto_ptr // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: auto_ptr is deprecated // CHECK-FIXES: #define MACRO_3(Type) std::unique_ptr MACRO_3(float)r(new float()); #define MACRO_4 std::auto_ptr // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: auto_ptr is deprecated // CHECK-FIXES: #define MACRO_4 std::unique_ptr using MACRO_4; #undef MACRO_1 #undef MACRO_2 #undef MACRO_3 #undef MACRO_4 } // Test function return values (definition). std::auto_ptr f_5() // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr f_5() { // Test constructor. return std::auto_ptr(new char()); // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: auto_ptr is deprecated // CHECK-FIXES: return std::unique_ptr(new char()); } // Test that non-std auto_ptr aren't replaced. void f_8() { ns_2::auto_ptr a; using namespace ns_2; auto_ptr b; } // Fail to modify when the template is never instantiated. // // This might not be an issue. If it's never used it doesn't really matter if // it's changed or not. If it's a header and one of the source use it, then it // will still be changed. template void f() { std::auto_ptr p; } // FIXME: Alias template could be replaced if a matcher existed. namespace std { template using aaaaaaaa = auto_ptr; } // We want to avoid replacing 'aaaaaaaa' by unique_ptr here. It's better to // change the type alias directly. std::aaaaaaaa d; void takes_ownership_fn(std::auto_ptr x); // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: auto_ptr is deprecated // CHECK-FIXES: void takes_ownership_fn(std::unique_ptr x); std::auto_ptr get_by_value(); // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr get_by_value(); class Wrapper { public: std::auto_ptr &get_wrapped(); // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated private: std::auto_ptr wrapped; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated }; void f() { std::auto_ptr a, b, c; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr a, b, c; Wrapper wrapper_a, wrapper_b; a = b; // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::move to transfer ownership // CHECK-FIXES: a = std::move(b); wrapper_a.get_wrapped() = wrapper_b.get_wrapped(); // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use std::move to transfer ownership // CHECK-FIXES: wrapper_a.get_wrapped() = std::move(wrapper_b.get_wrapped()); // Test that 'std::move()' is inserted when call to the // copy-constructor are made. takes_ownership_fn(c); // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: use std::move to transfer ownership // CHECK-FIXES: takes_ownership_fn(std::move(c)); takes_ownership_fn(wrapper_a.get_wrapped()); // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: use std::move to transfer ownership // CHECK-FIXES: takes_ownership_fn(std::move(wrapper_a.get_wrapped())); std::auto_ptr d[] = { std::auto_ptr(new int(1)), std::auto_ptr(new int(2)) }; // CHECK-MESSAGES: :[[@LINE-2]]:8: warning: auto_ptr is deprecated // CHECK-MESSAGES: :[[@LINE-3]]:35: warning: auto_ptr is deprecated // CHECK-MESSAGES: :[[@LINE-3]]:35: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr d[] = { std::unique_ptr(new int(1)), // CHECK-FIXES-NEXT: std::unique_ptr(new int(2)) }; std::auto_ptr e = d[0]; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-MESSAGES: :[[@LINE-2]]:26: warning: use std::move to transfer ownership // CHECK: std::unique_ptr e = std::move(d[0]); // Test that std::move() is not used when assigning an rvalue std::auto_ptr f; // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr f; f = std::auto_ptr(new int(0)); // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: auto_ptr is deprecated // CHECK-NEXT: f = std::unique_ptr(new int(0)); std::auto_ptr g = get_by_value(); // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: auto_ptr is deprecated // CHECK-FIXES: std::unique_ptr g = get_by_value(); }