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());
|
|
}
|