forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			170 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %check_clang_tidy %s boost-use-to-string %t
 | 
						|
 | 
						|
namespace std {
 | 
						|
 | 
						|
template <typename T>
 | 
						|
class basic_string {};
 | 
						|
 | 
						|
using string = basic_string<char>;
 | 
						|
using wstring = basic_string<wchar_t>;
 | 
						|
}
 | 
						|
 | 
						|
namespace boost {
 | 
						|
template <typename T, typename V>
 | 
						|
T lexical_cast(const V &) {
 | 
						|
  return T();
 | 
						|
};
 | 
						|
}
 | 
						|
 | 
						|
struct my_weird_type {};
 | 
						|
 | 
						|
std::string fun(const std::string &) {}
 | 
						|
 | 
						|
void test_to_string1() {
 | 
						|
 | 
						|
  auto xa = boost::lexical_cast<std::string>(5);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::to_string instead of boost::lexical_cast<std::string> [boost-use-to-string]
 | 
						|
  // CHECK-FIXES: auto xa = std::to_string(5);
 | 
						|
 | 
						|
  auto z = boost::lexical_cast<std::string>(42LL);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: auto z = std::to_string(42LL);
 | 
						|
 | 
						|
  // this should not trigger
 | 
						|
  fun(boost::lexical_cast<std::string>(42.0));
 | 
						|
  auto non = boost::lexical_cast<my_weird_type>(42);
 | 
						|
  boost::lexical_cast<int>("12");
 | 
						|
}
 | 
						|
 | 
						|
void test_to_string2() {
 | 
						|
  int a;
 | 
						|
  long b;
 | 
						|
  long long c;
 | 
						|
  unsigned d;
 | 
						|
  unsigned long e;
 | 
						|
  unsigned long long f;
 | 
						|
  float g;
 | 
						|
  double h;
 | 
						|
  long double i;
 | 
						|
  bool j;
 | 
						|
 | 
						|
  fun(boost::lexical_cast<std::string>(a));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: fun(std::to_string(a));
 | 
						|
  fun(boost::lexical_cast<std::string>(b));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: fun(std::to_string(b));
 | 
						|
  fun(boost::lexical_cast<std::string>(c));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: fun(std::to_string(c));
 | 
						|
  fun(boost::lexical_cast<std::string>(d));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: fun(std::to_string(d));
 | 
						|
  fun(boost::lexical_cast<std::string>(e));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: fun(std::to_string(e));
 | 
						|
  fun(boost::lexical_cast<std::string>(f));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: fun(std::to_string(f));
 | 
						|
 | 
						|
  // No change for floating numbers.
 | 
						|
  fun(boost::lexical_cast<std::string>(g));
 | 
						|
  fun(boost::lexical_cast<std::string>(h));
 | 
						|
  fun(boost::lexical_cast<std::string>(i));
 | 
						|
  // And bool.
 | 
						|
  fun(boost::lexical_cast<std::string>(j));
 | 
						|
}
 | 
						|
 | 
						|
std::string fun(const std::wstring &) {}
 | 
						|
 | 
						|
void test_to_wstring() {
 | 
						|
  int a;
 | 
						|
  long b;
 | 
						|
  long long c;
 | 
						|
  unsigned d;
 | 
						|
  unsigned long e;
 | 
						|
  unsigned long long f;
 | 
						|
  float g;
 | 
						|
  double h;
 | 
						|
  long double i;
 | 
						|
  bool j;
 | 
						|
 | 
						|
  fun(boost::lexical_cast<std::wstring>(a));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring instead of boost::lexical_cast<std::wstring> [boost-use-to-string]
 | 
						|
  // CHECK-FIXES: fun(std::to_wstring(a));
 | 
						|
  fun(boost::lexical_cast<std::wstring>(b));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring
 | 
						|
  // CHECK-FIXES: fun(std::to_wstring(b));
 | 
						|
  fun(boost::lexical_cast<std::wstring>(c));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring
 | 
						|
  // CHECK-FIXES: fun(std::to_wstring(c));
 | 
						|
  fun(boost::lexical_cast<std::wstring>(d));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring
 | 
						|
  // CHECK-FIXES: fun(std::to_wstring(d));
 | 
						|
  fun(boost::lexical_cast<std::wstring>(e));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring
 | 
						|
  // CHECK-FIXES: fun(std::to_wstring(e));
 | 
						|
  fun(boost::lexical_cast<std::wstring>(f));
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring
 | 
						|
  // CHECK-FIXES: fun(std::to_wstring(f));
 | 
						|
 | 
						|
  // No change for floating numbers
 | 
						|
  fun(boost::lexical_cast<std::wstring>(g));
 | 
						|
  fun(boost::lexical_cast<std::wstring>(h));
 | 
						|
  fun(boost::lexical_cast<std::wstring>(i));
 | 
						|
  // and bool.
 | 
						|
  fun(boost::lexical_cast<std::wstring>(j));
 | 
						|
}
 | 
						|
 | 
						|
const auto glob = boost::lexical_cast<std::string>(42);
 | 
						|
// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: use std::to_string
 | 
						|
// CHECK-FIXES: const auto glob = std::to_string(42);
 | 
						|
 | 
						|
template <typename T>
 | 
						|
void string_as_T(T t = T()) {
 | 
						|
  boost::lexical_cast<std::string>(42);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: std::to_string(42);
 | 
						|
 | 
						|
  boost::lexical_cast<T>(42);
 | 
						|
  string_as_T(boost::lexical_cast<T>(42));
 | 
						|
  auto p = boost::lexical_cast<T>(42);
 | 
						|
  auto p2 = (T)boost::lexical_cast<T>(42);
 | 
						|
  auto p3 = static_cast<T>(boost::lexical_cast<T>(42));
 | 
						|
}
 | 
						|
 | 
						|
#define my_to_string boost::lexical_cast<std::string>
 | 
						|
 | 
						|
void no_fixup_inside_macro() {
 | 
						|
  my_to_string(12);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use std::to_string
 | 
						|
}
 | 
						|
 | 
						|
void no_warnings() {
 | 
						|
  fun(boost::lexical_cast<std::string>("abc"));
 | 
						|
  fun(boost::lexical_cast<std::wstring>("abc"));
 | 
						|
  fun(boost::lexical_cast<std::string>(my_weird_type{}));
 | 
						|
  string_as_T<int>();
 | 
						|
  string_as_T<std::string>();
 | 
						|
}
 | 
						|
 | 
						|
struct Fields {
 | 
						|
  int integer;
 | 
						|
  float floating;
 | 
						|
  Fields* wierd;
 | 
						|
  const int &getConstInteger() const {return integer;}
 | 
						|
};
 | 
						|
 | 
						|
void testFields() {
 | 
						|
  Fields fields;
 | 
						|
  auto s1 = boost::lexical_cast<std::string>(fields.integer);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: auto s1 = std::to_string(fields.integer);
 | 
						|
 | 
						|
  auto s2 = boost::lexical_cast<std::string>(fields.floating);
 | 
						|
  auto s3 = boost::lexical_cast<std::string>(fields.wierd);
 | 
						|
  auto s4 = boost::lexical_cast<std::string>(fields.getConstInteger());
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::to_string
 | 
						|
  // CHECK-FIXES: auto s4 = std::to_string(fields.getConstInteger());
 | 
						|
}
 |