Skip to content

Commit f8580c9

Browse files
authored
[clang-tidy] Make readability-redundant-control-flow not suggest deleting unrelated lines (llvm#171287)
Closes llvm#171200.
1 parent feef80c commit f8580c9

File tree

3 files changed

+60
-13
lines changed

3 files changed

+60
-13
lines changed

clang-tools-extra/clang-tidy/readability/RedundantControlFlowCheck.cpp

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,11 @@ void RedundantControlFlowCheck::issueDiagnostic(
7171
if (isLocationInMacroExpansion(SM, StmtRange.getBegin()))
7272
return;
7373

74-
const CompoundStmt::const_reverse_body_iterator Previous =
75-
++Block->body_rbegin();
76-
SourceLocation Start;
77-
if (Previous != Block->body_rend())
78-
Start = Lexer::findLocationAfterToken(
79-
cast<Stmt>(*Previous)->getEndLoc(), tok::semi, SM, getLangOpts(),
80-
/*SkipTrailingWhitespaceAndNewLine=*/true);
81-
if (!Start.isValid())
82-
Start = StmtRange.getBegin();
83-
auto RemovedRange = CharSourceRange::getCharRange(
84-
Start, Lexer::findLocationAfterToken(
85-
StmtRange.getEnd(), tok::semi, SM, getLangOpts(),
86-
/*SkipTrailingWhitespaceAndNewLine=*/true));
74+
const auto RemovedRange = CharSourceRange::getCharRange(
75+
StmtRange.getBegin(),
76+
Lexer::findLocationAfterToken(StmtRange.getEnd(), tok::semi, SM,
77+
getLangOpts(),
78+
/*SkipTrailingWhitespaceAndNewLine=*/true));
8779

8880
diag(StmtRange.getBegin(), Diag) << FixItHint::CreateRemoval(RemovedRange);
8981
}

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,11 @@ Changes in existing checks
586586
<clang-tidy/checks/readability/redundant-casting>` check by fixing false
587587
negatives when explicitly cast from function pointer.
588588

589+
- Improved :doc:`readability-redundant-control-flow
590+
<clang-tidy/checks/readability/redundant-control-flow>` by fixing an issue
591+
where the check would sometimes suggest deleting not only a redundant
592+
``return`` or ``continue``, but also unrelated lines preceding it.
593+
589594
- Improved :doc:`readability-uppercase-literal-suffix
590595
<clang-tidy/checks/readability/uppercase-literal-suffix>` check to recognize
591596
literal suffixes added in C++23 and C23.

clang-tools-extra/test/clang-tidy/checkers/readability/redundant-control-flow.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,53 @@ void call_templates() {
222222
template_loop(10L);
223223
template_loop(10U);
224224
}
225+
226+
void dont_delete_lines_before_return_statement() {
227+
do {} while (0);
228+
#ifdef FOO
229+
#endif
230+
return;
231+
}
232+
// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: redundant return statement
233+
// CHECK-FIXES: void dont_delete_lines_before_return_statement() {
234+
// CHECK-FIXES-NEXT: do {} while (0);
235+
// CHECK-FIXES-NEXT: #ifdef FOO
236+
// CHECK-FIXES-NEXT: #endif
237+
// CHECK-FIXES-NEXT: }
238+
239+
void dont_delete_lines_before_continue_statement() {
240+
for (;;) {
241+
do {} while (0);
242+
#ifdef BAR
243+
#endif
244+
continue;
245+
}
246+
}
247+
// CHECK-MESSAGES: :[[@LINE-3]]:5: warning: redundant continue statement
248+
// CHECK-FIXES: void dont_delete_lines_before_continue_statement() {
249+
// CHECK-FIXES-NEXT: for (;;) {
250+
// CHECK-FIXES-NEXT: do {} while (0);
251+
// CHECK-FIXES-NEXT: #ifdef BAR
252+
// CHECK-FIXES-NEXT: #endif
253+
// CHECK-FIXES-NEXT: }
254+
// CHECK-FIXES-NEXT: }
255+
256+
void semicolon_far_from_return() {
257+
return
258+
259+
;
260+
}
261+
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: redundant return statement at the end of a function with a void return type [readability-redundant-control-flow]
262+
// CHECK-FIXES: void semicolon_far_from_return() {
263+
// CHECK-FIXES-NEXT: }
264+
265+
void semicolon_far_from_continue() {
266+
for (int i = 0; i < 20; ++i) {
267+
continue
268+
269+
;
270+
}
271+
}
272+
// CHECK-MESSAGES: :[[@LINE-5]]:5: warning: redundant continue statement at the end of loop statement
273+
// CHECK-FIXES: for (int i = 0; i < 20; ++i) {
274+
// CHECK-FIXES-NEXT: }

0 commit comments

Comments
 (0)