1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
// 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());
}
|