blob: 213947f3709bcea8fe40c42146fa07f77f7aceec [file] [log] [blame]
// RUN: %check_clang_tidy %s cppcoreguidelines-avoid-goto %t
void noop() {}
int main() {
noop();
goto jump_to_me;
// CHECK-MESSAGES: [[@LINE-1]]:3: warning: avoid using 'goto' for flow control
// CHECK-MESSAGES: [[@LINE+3]]:1: note: label defined here
noop();
jump_to_me:;
jump_backwards:;
noop();
goto jump_backwards;
// CHECK-MESSAGES: [[@LINE-1]]:3: warning: avoid using 'goto' for flow control
// CHECK-MESSAGES: [[@LINE-4]]:1: note: label defined here
goto jump_in_line;
;
jump_in_line:;
// CHECK-MESSAGES: [[@LINE-3]]:3: warning: avoid using 'goto' for flow control
// CHECK-MESSAGES: [[@LINE-2]]:1: note: label defined here
// Test the GNU extension https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
some_label:;
void *dynamic_label = &&some_label;
// FIXME: `IndirectGotoStmt` is not detected.
goto *dynamic_label;
}
void forward_jump_out_nested_loop() {
int array[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 10; ++i) {
noop();
for (int j = 0; j < 10; ++j) {
noop();
if (i + j > 10)
goto early_exit1;
}
noop();
}
for (int i = 0; i < 10; ++i) {
noop();
while (true) {
noop();
if (i > 5)
goto early_exit1;
}
noop();
}
for (auto value : array) {
noop();
for (auto number : array) {
noop();
if (number == 5)
goto early_exit1;
}
}
do {
noop();
do {
noop();
goto early_exit1;
} while (true);
} while (true);
do {
for (auto number : array) {
noop();
if (number == 2)
goto early_exit1;
}
} while (true);
// Jumping further results in error, because the variable declaration would
// be skipped.
early_exit1:;
int i = 0;
while (true) {
noop();
while (true) {
noop();
if (i > 5)
goto early_exit2;
i++;
}
noop();
}
while (true) {
noop();
for (int j = 0; j < 10; ++j) {
noop();
if (j > 5)
goto early_exit2;
}
noop();
}
while (true) {
noop();
for (auto number : array) {
if (number == 1)
goto early_exit2;
noop();
}
}
while (true) {
noop();
do {
noop();
goto early_exit2;
} while (true);
}
early_exit2:;
}
void jump_out_backwards() {
before_the_loop:
noop();
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
if (i * j > 80)
goto before_the_loop;
// CHECK-MESSAGES: [[@LINE-1]]:9: warning: avoid using 'goto' for flow control
// CHECK-MESSAGES: [[@LINE-8]]:1: note: label defined here
}
}
}