From 9c8cfa09d762a307bae55b75b621cbc53f4a3b3b Mon Sep 17 00:00:00 2001 From: Tyker Date: Tue, 10 Dec 2019 22:09:20 +0100 Subject: [PATCH] [Diagnsotics] Small Improvement on -Wmisleading-indentation Reviewers: aaron.ballman Reviewed By: aaron.ballman Subscribers: xbolva00 Differential Revision: https://reviews.llvm.org/D71083 --- clang/lib/Parse/ParseStmt.cpp | 10 +++++---- .../Parser/warn-misleading-indentation.cpp | 21 ++++++++++++++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index dc951dc22f55..203f30610ce7 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -1201,13 +1201,12 @@ struct MisleadingIndentationChecker { SourceLocation PrevLoc; unsigned NumDirectives; MisleadingStatementKind Kind; - bool NeedsChecking; bool ShouldSkip; MisleadingIndentationChecker(Parser &P, MisleadingStatementKind K, SourceLocation SL) : P(P), StmtLoc(SL), PrevLoc(P.getCurToken().getLocation()), NumDirectives(P.getPreprocessor().getNumDirectives()), Kind(K), - NeedsChecking(true), ShouldSkip(P.getCurToken().is(tok::l_brace)) { + ShouldSkip(P.getCurToken().is(tok::l_brace)) { if (!P.MisleadingIndentationElseLoc.isInvalid()) { StmtLoc = P.MisleadingIndentationElseLoc; P.MisleadingIndentationElseLoc = SourceLocation(); @@ -1216,9 +1215,10 @@ struct MisleadingIndentationChecker { P.MisleadingIndentationElseLoc = SL; } void Check() { - NeedsChecking = false; Token Tok = P.getCurToken(); - if (ShouldSkip || NumDirectives != P.getPreprocessor().getNumDirectives() || + if (P.getActions().getDiagnostics().isIgnored( + diag::warn_misleading_indentation, Tok.getLocation()) || + ShouldSkip || NumDirectives != P.getPreprocessor().getNumDirectives() || Tok.isOneOf(tok::semi, tok::r_brace) || Tok.isAnnotation() || Tok.getLocation().isMacroID() || PrevLoc.isMacroID() || StmtLoc.isMacroID() || @@ -1226,6 +1226,8 @@ struct MisleadingIndentationChecker { P.MisleadingIndentationElseLoc = SourceLocation(); return; } + if (Kind == MSK_else) + P.MisleadingIndentationElseLoc = SourceLocation(); SourceManager &SM = P.getPreprocessor().getSourceManager(); unsigned PrevColNum = SM.getSpellingColumnNumber(PrevLoc); diff --git a/clang/test/Parser/warn-misleading-indentation.cpp b/clang/test/Parser/warn-misleading-indentation.cpp index e5ed8bba93c1..d366db767e67 100644 --- a/clang/test/Parser/warn-misleading-indentation.cpp +++ b/clang/test/Parser/warn-misleading-indentation.cpp @@ -205,4 +205,23 @@ void a3(int i) { i = 4; } return; -} \ No newline at end of file +} + +void s(int num) { + { + if (1) + return; + else + return; + return; + } + if (0) +#ifdef WITH_WARN +// expected-note@-2 {{here}} +#endif + return; + return; +#ifdef WITH_WARN +// expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} +#endif +}