forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
// 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;
 | 
						|
 | 
						|
  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);
 | 
						|
}
 |