forked from OSchip/llvm-project
101 lines
2.8 KiB
ReStructuredText
101 lines
2.8 KiB
ReStructuredText
.. title:: clang-tidy - readability-isolate-declaration
|
|
|
|
readability-isolate-declaration
|
|
===============================
|
|
|
|
Detects local variable declarations declaring more than one variable and
|
|
tries to refactor the code to one statement per declaration.
|
|
|
|
The automatic code-transformation will use the same indentation as the original
|
|
for every created statement and add a line break after each statement.
|
|
It keeps the order of the variable declarations consistent, too.
|
|
|
|
.. code-block:: c++
|
|
|
|
void f() {
|
|
int * pointer = nullptr, value = 42, * const const_ptr = &value;
|
|
// This declaration will be diagnosed and transformed into:
|
|
// int * pointer = nullptr;
|
|
// int value = 42;
|
|
// int * const const_ptr = &value;
|
|
}
|
|
|
|
|
|
The check excludes places where it is necessary or common to declare
|
|
multiple variables in one statement and there is no other way supported in the
|
|
language. Please note that structured bindings are not considered.
|
|
|
|
.. code-block:: c++
|
|
|
|
// It is not possible to transform this declaration and doing the declaration
|
|
// before the loop will increase the scope of the variable 'Begin' and 'End'
|
|
// which is undesirable.
|
|
for (int Begin = 0, End = 100; Begin < End; ++Begin);
|
|
if (int Begin = 42, Result = some_function(Begin); Begin == Result);
|
|
|
|
// It is not possible to transform this declaration because the result is
|
|
// not functionality preserving as 'j' and 'k' would not be part of the
|
|
// 'if' statement anymore.
|
|
if (SomeCondition())
|
|
int i = 42, j = 43, k = function(i,j);
|
|
|
|
|
|
Limitations
|
|
-----------
|
|
|
|
Global variables and member variables are excluded.
|
|
|
|
The check currently does not support the automatic transformation of
|
|
member-pointer-types.
|
|
|
|
.. code-block:: c++
|
|
|
|
struct S {
|
|
int a;
|
|
const int b;
|
|
void f() {}
|
|
};
|
|
|
|
void f() {
|
|
// Only a diagnostic message is emitted
|
|
int S::*p = &S::a, S::*const q = &S::a;
|
|
}
|
|
|
|
Furthermore, the transformation is very cautious when it detects various kinds
|
|
of macros or preprocessor directives in the range of the statement. In this
|
|
case the transformation will not happen to avoid unexpected side-effects due to
|
|
macros.
|
|
|
|
.. code-block:: c++
|
|
|
|
#define NULL 0
|
|
#define MY_NICE_TYPE int **
|
|
#define VAR_NAME(name) name##__LINE__
|
|
#define A_BUNCH_OF_VARIABLES int m1 = 42, m2 = 43, m3 = 44;
|
|
|
|
void macros() {
|
|
int *p1 = NULL, *p2 = NULL;
|
|
// Will be transformed to
|
|
// int *p1 = NULL;
|
|
// int *p2 = NULL;
|
|
|
|
MY_NICE_TYPE p3, v1, v2;
|
|
// Won't be transformed, but a diagnostic is emitted.
|
|
|
|
int VAR_NAME(v3),
|
|
VAR_NAME(v4),
|
|
VAR_NAME(v5);
|
|
// Won't be transformed, but a diagnostic is emitted.
|
|
|
|
A_BUNCH_OF_VARIABLES
|
|
// Won't be transformed, but a diagnostic is emitted.
|
|
|
|
int Unconditional,
|
|
#if CONFIGURATION
|
|
IfConfigured = 42,
|
|
#else
|
|
IfConfigured = 0;
|
|
#endif
|
|
// Won't be transformed, but a diagnostic is emitted.
|
|
}
|