forked from OSchip/llvm-project
[clang-tidy] Fix crash on end location inside macro
Summary: Lexer::getLocForEndOfToken is defined to return an invalid location if the given location is inside a macro. Other checks conditionally warn based off location validity. Updating this check to do the same. Reviewers: JonasToth, aaron.ballman, nickdesaulniers Reviewed By: nickdesaulniers Subscribers: lebedev.ri, nickdesaulniers, xazax.hun, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64607 llvm-svn: 366353
This commit is contained in:
parent
dce1954f45
commit
b53e13cd43
|
@ -132,9 +132,12 @@ void BranchCloneCheck::check(const MatchFinder::MatchResult &Result) {
|
|||
// We report the first occurence only when we find the second one.
|
||||
diag(Branches[i]->getBeginLoc(),
|
||||
"repeated branch in conditional chain");
|
||||
diag(Lexer::getLocForEndOfToken(Branches[i]->getEndLoc(), 0,
|
||||
*Result.SourceManager, getLangOpts()),
|
||||
"end of the original", DiagnosticIDs::Note);
|
||||
SourceLocation End =
|
||||
Lexer::getLocForEndOfToken(Branches[i]->getEndLoc(), 0,
|
||||
*Result.SourceManager, getLangOpts());
|
||||
if (End.isValid()) {
|
||||
diag(End, "end of the original", DiagnosticIDs::Note);
|
||||
}
|
||||
}
|
||||
|
||||
diag(Branches[j]->getBeginLoc(), "clone %0 starts here",
|
||||
|
@ -208,10 +211,12 @@ void BranchCloneCheck::check(const MatchFinder::MatchResult &Result) {
|
|||
|
||||
if (EndLoc.isMacroID())
|
||||
EndLoc = Context.getSourceManager().getExpansionLoc(EndLoc);
|
||||
EndLoc = Lexer::getLocForEndOfToken(EndLoc, 0, *Result.SourceManager,
|
||||
getLangOpts());
|
||||
|
||||
diag(Lexer::getLocForEndOfToken(EndLoc, 0, *Result.SourceManager,
|
||||
getLangOpts()),
|
||||
"last of these clones ends here", DiagnosticIDs::Note);
|
||||
if (EndLoc.isValid()) {
|
||||
diag(EndLoc, "last of these clones ends here", DiagnosticIDs::Note);
|
||||
}
|
||||
}
|
||||
BeginCurrent = EndCurrent;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// RUN: %check_clang_tidy %s bugprone-branch-clone %t
|
||||
int x = 0;
|
||||
int y = 1;
|
||||
#define a(b, c) \
|
||||
typeof(b) d; \
|
||||
if (b) \
|
||||
d = b; \
|
||||
else if (c) \
|
||||
d = b;
|
||||
|
||||
f() {
|
||||
// CHECK-MESSAGES: warning: repeated branch in conditional chain [bugprone-branch-clone]
|
||||
a(x, y)
|
||||
}
|
Loading…
Reference in New Issue