Files
TheRock/compiler/amd-llvm/clang-tools-extra/docs/clang-tidy/checks/performance/unnecessary-copy-initialization.rst
T
derek.holloway 7502bf64a4
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
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

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.
}