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