summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2015-09-09 17:06:09 +0000
committerAlexander Kornienko <alexfh@google.com>2015-09-09 17:06:09 +0000
commitffc277989be5531ebf3f2a6b023f54d7929067b9 (patch)
tree1f3f18678530c7d1f431328368eb2d62befab6ed
parentef67d768691f7dd2c69f455f5d4479608eba792f (diff)
downloadbcm5719-llvm-ffc277989be5531ebf3f2a6b023f54d7929067b9.tar.gz
bcm5719-llvm-ffc277989be5531ebf3f2a6b023f54d7929067b9.zip
[clang-tidy] Fix PR22785.
Fix http://llvm.org/PR22785. Bug 22785 - readability-braces-around-statements doesn't work well with macros. http://reviews.llvm.org/D12729 Patch by Marek Kurdej! llvm-svn: 247163
-rw-r--r--clang-tools-extra/clang-tidy/readability/BracesAroundStatementsCheck.cpp15
-rw-r--r--clang-tools-extra/test/clang-tidy/readability-braces-around-statements.cpp13
-rw-r--r--clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp21
3 files changed, 44 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/readability/BracesAroundStatementsCheck.cpp b/clang-tools-extra/clang-tidy/readability/BracesAroundStatementsCheck.cpp
index 350fa8120f0..39534e26ee4 100644
--- a/clang-tools-extra/clang-tidy/readability/BracesAroundStatementsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/BracesAroundStatementsCheck.cpp
@@ -172,7 +172,7 @@ SourceLocation
BracesAroundStatementsCheck::findRParenLoc(const IfOrWhileStmt *S,
const SourceManager &SM,
const ASTContext *Context) {
- // Skip macros
+ // Skip macros.
if (S->getLocStart().isMacroID())
return SourceLocation();
@@ -219,13 +219,17 @@ bool BracesAroundStatementsCheck::checkStmt(
// Already inside braces.
return false;
}
- // Skip macros.
- if (S->getLocStart().isMacroID())
- return false;
const SourceManager &SM = *Result.SourceManager;
const ASTContext *Context = Result.Context;
+ // Treat macros.
+ CharSourceRange FileRange = Lexer::makeFileCharRange(
+ CharSourceRange::getTokenRange(S->getSourceRange()), SM,
+ Context->getLangOpts());
+ if (FileRange.isInvalid())
+ return false;
+
// InitialLoc points at the last token before opening brace to be inserted.
assert(InitialLoc.isValid());
SourceLocation StartLoc =
@@ -237,7 +241,8 @@ bool BracesAroundStatementsCheck::checkStmt(
EndLoc = EndLocHint;
ClosingInsertion = "} ";
} else {
- EndLoc = findEndLocation(S->getLocEnd(), SM, Context);
+ const auto FREnd = FileRange.getEnd().getLocWithOffset(-1);
+ EndLoc = findEndLocation(FREnd, SM, Context);
ClosingInsertion = "\n}";
}
diff --git a/clang-tools-extra/test/clang-tidy/readability-braces-around-statements.cpp b/clang-tools-extra/test/clang-tidy/readability-braces-around-statements.cpp
index c08be2b0923..0f0b76548d0 100644
--- a/clang-tools-extra/test/clang-tidy/readability-braces-around-statements.cpp
+++ b/clang-tools-extra/test/clang-tidy/readability-braces-around-statements.cpp
@@ -171,3 +171,16 @@ void test() {
// CHECK-FIXES-NEXT: }
// CHECK-FIXES-NEXT: }
}
+
+#define M(x) x
+
+int test_macros(bool b) {
+ if (b) {
+ return 1;
+ } else
+ M(return 2);
+ // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: statement should be inside braces
+ // CHECK-FIXES: } else {
+ // CHECK-FIXES-NEXT: M(return 2);
+ // CHECK-FIXES-NEXT: }
+}
diff --git a/clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp b/clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
index 9b44ac55917..446775bdce6 100644
--- a/clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
+++ b/clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
@@ -457,6 +457,27 @@ TEST(BracesAroundStatementsCheck, Macros) {
"int main() {\n"
" FOR(;;)\n"
"}");
+ EXPECT_EQ("#define DO_IT ++i\n"
+ "int i = 0;\n"
+ "int main() {\n"
+ " if (false) {\n"
+ " DO_IT;\n"
+ " } else if (1 == 2) {\n"
+ " DO_IT;\n"
+ " } else {\n"
+ " DO_IT;\n"
+ "}\n"
+ "}",
+ runCheckOnCode<BracesAroundStatementsCheck>("#define DO_IT ++i\n"
+ "int i = 0;\n"
+ "int main() {\n"
+ " if (false)\n"
+ " DO_IT;\n"
+ " else if (1 == 2)\n"
+ " DO_IT;\n"
+ " else\n"
+ " DO_IT;\n"
+ "}"));
}
} // namespace test
OpenPOWER on IntegriCloud