================
@@ -0,0 +1,134 @@
+// RUN: %check_clang_tidy -std=c++17-or-later %s
performance-string-view-conversions %t -- \
+// RUN: -- -isystem %clang_tidy_headers
+
+#include <string>
+
+using namespace std::literals::string_literals;
+using namespace std::literals::string_view_literals;
+
+// Support for std::move
+namespace std {
+template <typename>
+struct remove_reference;
+
+template <typename _Tp>
+struct remove_reference {
+ typedef _Tp type;
+};
+
+template <typename _Tp>
+struct remove_reference<_Tp &> {
+ typedef _Tp type;
+};
+
+template <typename _Tp>
+struct remove_reference<_Tp &&> {
+ typedef _Tp type;
+};
+
+template <typename _Tp>
+constexpr typename std::remove_reference<_Tp>::type &&move(_Tp &&__t) {
+ return static_cast<typename std::remove_reference<_Tp>::type &&>(__t);
+}
+} // namespace std
+
+void foo_sv(int p1, std::string_view p2, double p3);
+void foo_wsv(int p1, std::wstring_view p2, double p3);
+void foo_wsv(std::wstring_view p2);
+void foo_str(int p1, const std::string& p2, double p3);
+void foo_wstr(int p1, const std::wstring& p2, double p3);
+
+std::string foo_str(int p1);
+std::wstring foo_wstr(int, const std::string&);
+std::string_view foo_sv(int p1);
+
+void positive(std::string_view sv, std::wstring_view wsv) {
+ // string(string_view)
+ //
+ foo_sv(42, std::string(sv), 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to
'std::string' (aka 'basic_string<char>') and then back to 'std::string_view'
(aka 'basic_string_view<char>') [performance-string-view-conversions]
+ // CHECK-FIXES: foo_sv(42, sv, 3.14);
+
+ foo_sv(42, std::string("Hello, world"), 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to
'std::string' (aka 'basic_string<char>') and then back to 'std::string_view'
(aka 'basic_string_view<char>') [performance-string-view-conversions]
+ // CHECK-FIXES: foo_sv(42, "Hello, world", 3.14);
+
+ // TODO: support for ""sv literals
+ foo_sv(42, "Hello, world"s, 3.14);
+
+ foo_sv(42, std::string{"Hello, world"}, 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to
'std::string' (aka 'basic_string<char>') and then back to 'std::string_view'
(aka 'basic_string_view<char>') [performance-string-view-conversions]
+ // CHECK-FIXES: foo_sv(42, "Hello, world", 3.14);
+
+ const char *ptr = "Hello, world";
+ foo_sv(42, std::string(ptr), 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to
'std::string' (aka 'basic_string<char>') and then back to 'std::string_view'
(aka 'basic_string_view<char>') [performance-string-view-conversions]
+ // CHECK-FIXES: foo_sv(42, ptr, 3.14);
+
+ char arr[] = "Hello, world";
+ foo_sv(42, std::string(arr), 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to
'std::string' (aka 'basic_string<char>') and then back to 'std::string_view'
(aka 'basic_string_view<char>') [performance-string-view-conversions]
+ // CHECK-FIXES: foo_sv(42, arr, 3.14);
+
+ foo_sv(42, std::string(foo_sv(42)), 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to
'std::string' (aka 'basic_string<char>') and then back to 'std::string_view'
(aka 'basic_string_view<char>') [performance-string-view-conversions]
+ // CHECK-FIXES: foo_sv(42, foo_sv(42), 3.14);
+
+ std::string s = "hello";
+ foo_sv(42, std::string(s), 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to
'std::string' (aka 'basic_string<char>') and then back to 'std::string_view'
(aka 'basic_string_view<char>') [performance-string-view-conversions]
+ // CHECK-FIXES: foo_sv(42, s, 3.14);
+
+ foo_sv(42, std::string{s}, 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: redundant conversion to
'std::string' (aka 'basic_string<char>') and then back to 'std::string_view'
(aka 'basic_string_view<char>') [performance-string-view-conversions]
+ // CHECK-FIXES: foo_sv(42, s, 3.14);
+
+ // wstring(wstring_view)
+ //
+ foo_wsv(42, std::wstring(wsv), 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: redundant conversion to
'std::wstring' (aka 'basic_string<wchar_t>') and then back to
'std::wstring_view' (aka 'basic_string_view<wchar_t>')
[performance-string-view-conversions]
+ // CHECK-FIXES: foo_wsv(42, wsv, 3.14);
+
+ const wchar_t *wptr = L"Hello, world";
+ foo_wsv(42, std::wstring(wptr), 3.14);
+ // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: redundant conversion to
'std::wstring' (aka 'basic_string<wchar_t>') and then back to
'std::wstring_view' (aka 'basic_string_view<wchar_t>')
[performance-string-view-conversions]
+ // CHECK-FIXES: foo_wsv(42, wptr, 3.14);
+}
+
+void negative(std::string_view sv, std::wstring_view wsv) {
+ // No warnings expected: already string_view
----------------
zeyi2 wrote:
Could we add a new testcase like: `foo_sv(42, std::string("Hello, world", 5),
3.14);`
(To make sure that no wrong fix-it is generated, by reading the implementation
I suspect that it may generate `std::string("Hello, world")`, which seems off.
We likely need to add `argumentCountIs(1)` to the matcher to prevent this.)
https://github.com/llvm/llvm-project/pull/174288
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits