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
81 lines
2.9 KiB
ReStructuredText
81 lines
2.9 KiB
ReStructuredText
.. title:: clang-tidy - performance-unnecessary-copy-initialization
|
|
|
|
performance-unnecessary-copy-initialization
|
|
===========================================
|
|
|
|
Finds local variable declarations that are initialized using the copy
|
|
constructor of a non-trivially-copyable type but it would suffice to obtain a
|
|
const reference.
|
|
|
|
The check is only applied if it is safe to replace the copy by a const
|
|
reference. This is the case when the variable is const qualified or when it is
|
|
only used as a const, i.e. only const methods or operators are invoked on it,
|
|
or it is used as const reference or value argument in constructors or function
|
|
calls.
|
|
|
|
Example:
|
|
|
|
.. code-block:: c++
|
|
|
|
const string& constReference();
|
|
void Function() {
|
|
// The warning will suggest making this a const reference.
|
|
const string UnnecessaryCopy = constReference();
|
|
}
|
|
|
|
struct Foo {
|
|
const string& name() const;
|
|
};
|
|
void Function(const Foo& foo) {
|
|
// The warning will suggest making this a const reference.
|
|
string UnnecessaryCopy1 = foo.name();
|
|
UnnecessaryCopy1.find("bar");
|
|
|
|
// The warning will suggest making this a const reference.
|
|
string UnnecessaryCopy2 = UnnecessaryCopy1;
|
|
UnnecessaryCopy2.find("bar");
|
|
}
|
|
|
|
Options
|
|
-------
|
|
|
|
.. option:: AllowedTypes
|
|
|
|
A semicolon-separated list of names of types allowed to be initialized by
|
|
copying. Regular expressions are accepted, e.g. ``[Rr]ef(erence)?$`` matches
|
|
every type with suffix ``Ref``, ``ref``, ``Reference`` and ``reference``.
|
|
The default is empty. 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``).
|
|
|
|
.. option:: ExcludedContainerTypes
|
|
|
|
A semicolon-separated list of names of types whose methods are allowed to
|
|
return the const reference the variable is copied from. When an expensive to
|
|
copy variable is copy initialized by the return value from a type on this
|
|
list the check does not trigger. This can be used to exclude types known to
|
|
be const incorrect or where the lifetime or immutability of returned
|
|
references is not tied to mutations of the container. An example are view
|
|
types that don't own the underlying data. Like for `AllowedTypes` above,
|
|
regular expressions are accepted and the inclusion of `::` determines whether
|
|
the qualified typename is matched or not.
|
|
|
|
|
|
Limitations
|
|
-----------
|
|
|
|
This check does not perform lifetime analysis and may suggest replacing copies
|
|
with const references that could become dangling. Be cautious when the
|
|
referenced object might be invalidated by subsequent operations.
|
|
|
|
.. code-block:: c++
|
|
|
|
void consume(const S&);
|
|
|
|
void func(std::vector<S> &Vec) {
|
|
const auto It = Vec.begin();
|
|
const S Value(*It); // The warning will suggest making this a const reference.
|
|
Vec.erase(It); // Container modifications could invalidate references.
|
|
consume(Value); // Safe with copy, dangling reference otherwise.
|
|
}
|