forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			124 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %check_clang_tidy %s modernize-use-emplace %t -- \
 | 
						|
// RUN:   -config="{CheckOptions: \
 | 
						|
// RUN:             [{key: modernize-use-emplace.IgnoreImplicitConstructors, \
 | 
						|
// RUN:               value: 1}] \
 | 
						|
// RUN:             }" -- -std=c++11
 | 
						|
 | 
						|
namespace std {
 | 
						|
template <typename>
 | 
						|
class initializer_list
 | 
						|
{
 | 
						|
public:
 | 
						|
  initializer_list() noexcept {}
 | 
						|
};
 | 
						|
 | 
						|
template <typename T>
 | 
						|
class vector {
 | 
						|
public:
 | 
						|
  vector() = default;
 | 
						|
  vector(initializer_list<T>) {}
 | 
						|
 | 
						|
  void push_back(const T &) {}
 | 
						|
  void push_back(T &&) {}
 | 
						|
 | 
						|
  template <typename... Args>
 | 
						|
  void emplace_back(Args &&... args){};
 | 
						|
  ~vector();
 | 
						|
};
 | 
						|
 | 
						|
} // namespace std
 | 
						|
 | 
						|
void testInts() {
 | 
						|
  std::vector<int> v;
 | 
						|
  v.push_back(42);
 | 
						|
  v.push_back(int(42));
 | 
						|
  v.push_back(int{42});
 | 
						|
  v.push_back(42.0);
 | 
						|
  int z;
 | 
						|
  v.push_back(z);
 | 
						|
}
 | 
						|
 | 
						|
struct Something {
 | 
						|
  Something(int a, int b = 41) {}
 | 
						|
  Something() {}
 | 
						|
  void push_back(Something);
 | 
						|
  int getInt() { return 42; }
 | 
						|
};
 | 
						|
 | 
						|
struct Convertable {
 | 
						|
  operator Something() { return Something{}; }
 | 
						|
};
 | 
						|
 | 
						|
struct Zoz {
 | 
						|
  Zoz(Something, int = 42) {}
 | 
						|
};
 | 
						|
 | 
						|
Zoz getZoz(Something s) { return Zoz(s); }
 | 
						|
 | 
						|
void test_Something() {
 | 
						|
  std::vector<Something> v;
 | 
						|
 | 
						|
  v.push_back(Something(1, 2));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back instead of push_back [modernize-use-emplace]
 | 
						|
  // CHECK-FIXES: v.emplace_back(1, 2);
 | 
						|
 | 
						|
  v.push_back(Something{1, 2});
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
 | 
						|
  // CHECK-FIXES: v.emplace_back(1, 2);
 | 
						|
 | 
						|
  v.push_back(Something());
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
 | 
						|
  // CHECK-FIXES: v.emplace_back();
 | 
						|
 | 
						|
  v.push_back(Something{});
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
 | 
						|
  // CHECK-FIXES: v.emplace_back();
 | 
						|
 | 
						|
  Something Different;
 | 
						|
  v.push_back(Something(Different.getInt(), 42));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
 | 
						|
  // CHECK-FIXES: v.emplace_back(Different.getInt(), 42);
 | 
						|
 | 
						|
  v.push_back(Different.getInt());
 | 
						|
  v.push_back(42);
 | 
						|
 | 
						|
  Something temporary(42, 42);
 | 
						|
  temporary.push_back(temporary);
 | 
						|
  v.push_back(temporary);
 | 
						|
 | 
						|
  v.push_back(Convertable());
 | 
						|
  v.push_back(Convertable{});
 | 
						|
  Convertable s;
 | 
						|
  v.push_back(s);
 | 
						|
}
 | 
						|
 | 
						|
template <typename ElemType>
 | 
						|
void dependOnElem() {
 | 
						|
  std::vector<ElemType> v;
 | 
						|
  v.push_back(ElemType(42));
 | 
						|
}
 | 
						|
 | 
						|
template <typename ContainerType>
 | 
						|
void dependOnContainer() {
 | 
						|
  ContainerType v;
 | 
						|
  v.push_back(Something(42));
 | 
						|
}
 | 
						|
 | 
						|
void callDependent() {
 | 
						|
  dependOnElem<Something>();
 | 
						|
  dependOnContainer<std::vector<Something>>();
 | 
						|
}
 | 
						|
 | 
						|
void test2() {
 | 
						|
  std::vector<Zoz> v;
 | 
						|
  v.push_back(Zoz(Something(21, 37)));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
 | 
						|
  // CHECK-FIXES: v.emplace_back(Something(21, 37));
 | 
						|
 | 
						|
  v.push_back(Zoz(Something(21, 37), 42));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
 | 
						|
  // CHECK-FIXES: v.emplace_back(Something(21, 37), 42);
 | 
						|
 | 
						|
  v.push_back(getZoz(Something(1, 2)));
 | 
						|
}
 |