CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
148 lines
4.6 KiB
ReStructuredText
148 lines
4.6 KiB
ReStructuredText
.. title:: clang-tidy - modernize-use-string-view
|
|
|
|
modernize-use-string-view
|
|
=========================
|
|
|
|
Looks for functions returning ``std::[w|u8|u16|u32]string`` and suggests to
|
|
change it to ``std::[...]string_view`` for performance reasons if possible.
|
|
|
|
Each time a new ``std::string`` is created from a literal, a copy of that
|
|
literal is allocated either in ``std::string``'s internal buffer
|
|
(for short literals) or on the heap.
|
|
|
|
For the cases where ``std::string`` is returned from a function,
|
|
such allocations can sometimes be eliminated by using ``std::string_view``
|
|
as a return type.
|
|
|
|
This check looks for such functions returning ``std::string`` constructed from
|
|
the literals and suggests replacing their return type to ``std::string_view``.
|
|
|
|
It handles ``std::string``, ``std::wstring``, ``std::u8string``,
|
|
``std::u16string`` and ``std::u32string`` along with their aliases and selects
|
|
the proper kind of ``std::string_view`` to return.
|
|
|
|
Consider the following example:
|
|
|
|
.. code-block:: c++
|
|
|
|
std::string foo(int i) {
|
|
switch(i) {
|
|
case 1:
|
|
return "case 1";
|
|
...
|
|
default:
|
|
return "default";
|
|
}
|
|
}
|
|
|
|
In the code above a new ``std::string`` object is created on each function
|
|
invocation, making a copy of a string literal and possibly allocating a memory
|
|
on the heap.
|
|
|
|
The check gets this code transformed into:
|
|
|
|
.. code-block:: c++
|
|
|
|
std::string_view foo(int i) {
|
|
switch(i) {
|
|
case 1:
|
|
return "case 1";
|
|
...
|
|
default:
|
|
return "default";
|
|
}
|
|
}
|
|
|
|
New version re-uses statically allocated literals without additional overhead.
|
|
|
|
Suppressing diagnostic
|
|
----------------------
|
|
|
|
To prevent an undesired diagnostic wrap the string literal with an explicit
|
|
``std::string(...)`` constructor:
|
|
|
|
.. code-block:: c++
|
|
|
|
std::string foo() {
|
|
return "default"; //warning and fix are generated
|
|
}
|
|
|
|
std::string bar() {
|
|
return std::string("default"); //warning and fix are NOT generated
|
|
}
|
|
|
|
Limitations
|
|
-----------
|
|
|
|
* No warning and/or fix are generated as for now for these code patterns:
|
|
|
|
* ``return std::string("literal");``
|
|
* ``return std::string{"literal"};``
|
|
* ``return "simpleLiteral"s;``
|
|
* ``auto foo() { return "autoReturn"; }``
|
|
* ``auto Trailing() -> std::string { return "Trailing"; }`` warns, doesn't fix
|
|
* returnings from lambda
|
|
* complicated macro and templated code
|
|
* overloaded functions and methods
|
|
|
|
In some cases the fixed code will not compile due to lack of conversion from
|
|
``std::string_view`` to ``std::string``. It can be fixed (preferably) by
|
|
converting receiver ``std::string`` to ``std::string_view`` if possible or
|
|
simply make an explicit conversion.
|
|
|
|
.. code-block:: c++
|
|
|
|
string foo() { // <--- will be replaced with string_view
|
|
return "foo";
|
|
}
|
|
|
|
void bar() {
|
|
string err = foo(); // <----- error: no viable conversion from
|
|
// 'std::string_view' (aka 'basic_string_view<char>')
|
|
// to 'std::string' (aka 'basic_string<char>')
|
|
|
|
string fix(foo()); // <----- no errors
|
|
}
|
|
|
|
|
|
Options
|
|
-------
|
|
|
|
.. option:: CheckOverloadedFunctions
|
|
|
|
If `true`, the check will also consider overloaded functions for
|
|
``string_view`` conversion suggestions. If `false`, overloaded
|
|
functions are skipped to avoid potential issues with ambiguous
|
|
conversions.
|
|
|
|
Default is `false`.
|
|
|
|
|
|
.. option:: IgnoredFunctions
|
|
|
|
A semicolon-separated list of the names of functions or methods to be
|
|
ignored. Regular expressions are accepted, e.g. `[Rr]ef(erence)?$` matches
|
|
every type with suffix ``Ref``, ``ref``, ``Reference`` and ``reference``.
|
|
|
|
If a name in the list contains the sequence `::` it is matched against the
|
|
qualified type name (i.e. ``namespace::Type``), otherwise it is matched
|
|
against only the type name (i.e. ``Type``).
|
|
|
|
The default is `toString$;ToString$;to_string$`.
|
|
|
|
|
|
.. option:: ReplacementStringViewClass
|
|
|
|
A semicolon-separated list of `string=string_view` pairs for replacing
|
|
``string`` to ``string_view`` counterparts.
|
|
|
|
============= ======================== =======================
|
|
Key Value (example) Default value
|
|
============= ======================== =======================
|
|
``string`` ``llvm::StringRef`` ``std::string_view``
|
|
``wstring`` ``boost::wstring_view`` ``std::wstring_view``
|
|
``u8string`` ``absl::u8string_view`` ``std::u8string_view``
|
|
``u16string`` ``QStringView`` ``std::u16string_view``
|
|
``u32string`` ``std::u32zstring_view`` ``std::u32string_view``
|
|
============= ======================== =======================
|