170 lines · cpp
1// RUN: %check_clang_tidy %s boost-use-to-string %t2 3namespace std {4 5template <typename T>6class basic_string {};7 8using string = basic_string<char>;9using wstring = basic_string<wchar_t>;10}11 12namespace boost {13template <typename T, typename V>14T lexical_cast(const V &) {15 return T();16};17}18 19struct my_weird_type {};20 21std::string fun(const std::string &) { return {}; }22 23void test_to_string1() {24 25 auto xa = boost::lexical_cast<std::string>(5);26 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::to_string instead of boost::lexical_cast<std::string> [boost-use-to-string]27 // CHECK-FIXES: auto xa = std::to_string(5);28 29 auto z = boost::lexical_cast<std::string>(42LL);30 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use std::to_string31 // CHECK-FIXES: auto z = std::to_string(42LL);32 33 // this should not trigger34 fun(boost::lexical_cast<std::string>(42.0));35 auto non = boost::lexical_cast<my_weird_type>(42);36 boost::lexical_cast<int>("12");37}38 39void test_to_string2() {40 int a;41 long b;42 long long c;43 unsigned d;44 unsigned long e;45 unsigned long long f;46 float g;47 double h;48 long double i;49 bool j;50 51 fun(boost::lexical_cast<std::string>(a));52 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string53 // CHECK-FIXES: fun(std::to_string(a));54 fun(boost::lexical_cast<std::string>(b));55 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string56 // CHECK-FIXES: fun(std::to_string(b));57 fun(boost::lexical_cast<std::string>(c));58 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string59 // CHECK-FIXES: fun(std::to_string(c));60 fun(boost::lexical_cast<std::string>(d));61 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string62 // CHECK-FIXES: fun(std::to_string(d));63 fun(boost::lexical_cast<std::string>(e));64 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string65 // CHECK-FIXES: fun(std::to_string(e));66 fun(boost::lexical_cast<std::string>(f));67 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_string68 // CHECK-FIXES: fun(std::to_string(f));69 70 // No change for floating numbers.71 fun(boost::lexical_cast<std::string>(g));72 fun(boost::lexical_cast<std::string>(h));73 fun(boost::lexical_cast<std::string>(i));74 // And bool.75 fun(boost::lexical_cast<std::string>(j));76}77 78std::string fun(const std::wstring &);79 80void test_to_wstring() {81 int a;82 long b;83 long long c;84 unsigned d;85 unsigned long e;86 unsigned long long f;87 float g;88 double h;89 long double i;90 bool j;91 92 fun(boost::lexical_cast<std::wstring>(a));93 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring instead of boost::lexical_cast<std::wstring> [boost-use-to-string]94 // CHECK-FIXES: fun(std::to_wstring(a));95 fun(boost::lexical_cast<std::wstring>(b));96 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring97 // CHECK-FIXES: fun(std::to_wstring(b));98 fun(boost::lexical_cast<std::wstring>(c));99 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring100 // CHECK-FIXES: fun(std::to_wstring(c));101 fun(boost::lexical_cast<std::wstring>(d));102 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring103 // CHECK-FIXES: fun(std::to_wstring(d));104 fun(boost::lexical_cast<std::wstring>(e));105 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring106 // CHECK-FIXES: fun(std::to_wstring(e));107 fun(boost::lexical_cast<std::wstring>(f));108 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::to_wstring109 // CHECK-FIXES: fun(std::to_wstring(f));110 111 // No change for floating numbers112 fun(boost::lexical_cast<std::wstring>(g));113 fun(boost::lexical_cast<std::wstring>(h));114 fun(boost::lexical_cast<std::wstring>(i));115 // and bool.116 fun(boost::lexical_cast<std::wstring>(j));117}118 119const auto glob = boost::lexical_cast<std::string>(42);120// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: use std::to_string121// CHECK-FIXES: const auto glob = std::to_string(42);122 123template <typename T>124void string_as_T(T t = T()) {125 boost::lexical_cast<std::string>(42);126 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use std::to_string127 // CHECK-FIXES: std::to_string(42);128 129 boost::lexical_cast<T>(42);130 string_as_T(boost::lexical_cast<T>(42));131 auto p = boost::lexical_cast<T>(42);132 auto p2 = (T)boost::lexical_cast<T>(42);133 auto p3 = static_cast<T>(boost::lexical_cast<T>(42));134}135 136#define my_to_string boost::lexical_cast<std::string>137 138void no_fixup_inside_macro() {139 my_to_string(12);140 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use std::to_string141}142 143void no_warnings() {144 fun(boost::lexical_cast<std::string>("abc"));145 fun(boost::lexical_cast<std::wstring>("abc"));146 fun(boost::lexical_cast<std::string>(my_weird_type{}));147 string_as_T<int>();148 string_as_T<std::string>();149}150 151struct Fields {152 int integer;153 float floating;154 Fields* wierd;155 const int &getConstInteger() const {return integer;}156};157 158void testFields() {159 Fields fields;160 auto s1 = boost::lexical_cast<std::string>(fields.integer);161 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::to_string162 // CHECK-FIXES: auto s1 = std::to_string(fields.integer);163 164 auto s2 = boost::lexical_cast<std::string>(fields.floating);165 auto s3 = boost::lexical_cast<std::string>(fields.wierd);166 auto s4 = boost::lexical_cast<std::string>(fields.getConstInteger());167 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::to_string168 // CHECK-FIXES: auto s4 = std::to_string(fields.getConstInteger());169}170