| // RUN: %check_clang_tidy %s performance-inefficient-string-concatenation %t |
| |
| namespace std { |
| template <typename T> |
| class basic_string { |
| public: |
| basic_string() {} |
| ~basic_string() {} |
| basic_string<T> *operator+=(const basic_string<T> &) {} |
| friend basic_string<T> operator+(const basic_string<T> &, const basic_string<T> &) {} |
| }; |
| typedef basic_string<char> string; |
| typedef basic_string<wchar_t> wstring; |
| } |
| |
| void f(std::string) {} |
| std::string g(std::string) {} |
| |
| int main() { |
| std::string mystr1, mystr2; |
| std::wstring mywstr1, mywstr2; |
| auto myautostr1 = mystr1; |
| auto myautostr2 = mystr2; |
| |
| for (int i = 0; i < 10; ++i) { |
| f(mystr1 + mystr2 + mystr1); |
| // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: string concatenation results in allocation of unnecessary temporary strings; consider using 'operator+=' or 'string::append()' instead |
| mystr1 = mystr1 + mystr2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation |
| mystr1 = mystr2 + mystr2 + mystr2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: string concatenation |
| mystr1 = mystr2 + mystr1; |
| // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation |
| mywstr1 = mywstr2 + mywstr1; |
| // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation |
| mywstr1 = mywstr2 + mywstr2 + mywstr2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: string concatenation |
| myautostr1 = myautostr1 + myautostr2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation |
| |
| mywstr1 = mywstr2 + mywstr2; |
| mystr1 = mystr2 + mystr2; |
| mystr1 += mystr2; |
| f(mystr2 + mystr1); |
| mystr1 = g(mystr1); |
| } |
| return 0; |
| } |