summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Biryukov <ibiryukov@google.com>2018-08-01 15:32:56 +0000
committerIlya Biryukov <ibiryukov@google.com>2018-08-01 15:32:56 +0000
commitf16a6fa8f3191afed71d7b7251af70391c8dc4fd (patch)
tree6f6bfc2dae23f1c263740c02c246a5d52a4ef899
parente0fcc68a32172cc572607d63fd2928818ceda7da (diff)
downloadbcm5719-llvm-f16a6fa8f3191afed71d7b7251af70391c8dc4fd.tar.gz
bcm5719-llvm-f16a6fa8f3191afed71d7b7251af70391c8dc4fd.zip
[Format] Fix for bug 35641
Summary: Bug was caused due to comments at the start of scope. For a code like: ``` int func() { // int b; int c; } ``` the comment at the first line gets IndentAndNestingLevel (1,1) whereas the following declarations get only (0,1) which prevents them from insertion of a new scope. So, I changed the AlignTokenSequence to look at previous *non-comment* token when deciding whether to introduce a new scope into stack or not. Patch by Kadir Cetinkaya! Reviewers: rsmith, djasper Reviewed By: djasper Subscribers: lebedev.ri, cfe-commits, klimek Tags: #clang Differential Revision: https://reviews.llvm.org/D43303 llvm-svn: 338578
-rw-r--r--clang/lib/Format/WhitespaceManager.cpp8
-rw-r--r--clang/unittests/Format/FormatTest.cpp8
2 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp
index 7070ce03c86..a88c22f4e96 100644
--- a/clang/lib/Format/WhitespaceManager.cpp
+++ b/clang/lib/Format/WhitespaceManager.cpp
@@ -255,8 +255,14 @@ AlignTokenSequence(unsigned Start, unsigned End, unsigned Column, F &&Matches,
Changes[ScopeStack.back()].indentAndNestingLevel())
ScopeStack.pop_back();
+ // Compare current token to previous non-comment token to ensure whether
+ // it is in a deeper scope or not.
+ unsigned PreviousNonComment = i - 1;
+ while (PreviousNonComment > Start &&
+ Changes[PreviousNonComment].Tok->is(tok::comment))
+ PreviousNonComment--;
if (i != Start && Changes[i].indentAndNestingLevel() >
- Changes[i - 1].indentAndNestingLevel())
+ Changes[PreviousNonComment].indentAndNestingLevel())
ScopeStack.push_back(i);
bool InsideNestedScope = ScopeStack.size() != 0;
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index f234e287cf1..2e780e163be 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -9804,6 +9804,14 @@ TEST_F(FormatTest, AlignConsecutiveDeclarations) {
"});\n",
Alignment);
Alignment.PointerAlignment = FormatStyle::PAS_Right;
+
+ // See llvm.org/PR35641
+ Alignment.AlignConsecutiveDeclarations = true;
+ verifyFormat("int func() { //\n"
+ " int b;\n"
+ " unsigned c;\n"
+ "}",
+ Alignment);
}
TEST_F(FormatTest, LinuxBraceBreaking) {
OpenPOWER on IntegriCloud