JakeMerdichAMD created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. JakeMerdichAMD added a project: clang-format. JakeMerdichAMD added reviewers: MyDeveloperDay, krasimir, VelocityRa, sylvestre.ledru, sammccall, enyquist. JakeMerdichAMD added a comment.
The failing case in this commit looks like the following after formatting (with alignconsecutiveassignments and a specific column limit) int x = 0; int yy = 1; ///specificlennospace int zzz = 2; See PR43845 for more failing cases besides this. When a '//comment' trails a consecutive alignment, it adds a whitespace replacement within the comment token. This wasn't handled correctly in the alignment code, which treats it as a whole token and thus double counts it. This can wrongly trigger the "line too long, it'll wrap" alignment-break condition with specific lengths, causing the alignment to break for seemingly no reason. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D79465 Files: clang/lib/Format/WhitespaceManager.cpp clang/unittests/Format/FormatTest.cpp Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -11564,6 +11564,16 @@ " x = 1;\n" "y = 1;\n", Alignment); + + Alignment.ReflowComments = true; + Alignment.ColumnLimit = 50; + EXPECT_EQ("int x = 0;\n" + "int yy = 1; /// specificlennospace\n" + "int zzz = 2;\n", + format("int x = 0;\n" + "int yy = 1; ///specificlennospace\n" + "int zzz = 2;\n", + Alignment)); } TEST_F(FormatTest, AlignConsecutiveDeclarations) { Index: clang/lib/Format/WhitespaceManager.cpp =================================================================== --- clang/lib/Format/WhitespaceManager.cpp +++ clang/lib/Format/WhitespaceManager.cpp @@ -410,8 +410,11 @@ unsigned ChangeMinColumn = Changes[i].StartOfTokenColumn; int LineLengthAfter = -Changes[i].Spaces; - for (unsigned j = i; j != e && Changes[j].NewlinesBefore == 0; ++j) - LineLengthAfter += Changes[j].Spaces + Changes[j].TokenLength; + for (unsigned j = i; j != e && Changes[j].NewlinesBefore == 0; ++j) { + LineLengthAfter += Changes[j].Spaces; + if (!Changes[j].IsInsideToken) + LineLengthAfter += Changes[j].TokenLength; + } unsigned ChangeMaxColumn = Style.ColumnLimit - LineLengthAfter; // If we are restricted by the maximum column width, end the sequence.
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -11564,6 +11564,16 @@ " x = 1;\n" "y = 1;\n", Alignment); + + Alignment.ReflowComments = true; + Alignment.ColumnLimit = 50; + EXPECT_EQ("int x = 0;\n" + "int yy = 1; /// specificlennospace\n" + "int zzz = 2;\n", + format("int x = 0;\n" + "int yy = 1; ///specificlennospace\n" + "int zzz = 2;\n", + Alignment)); } TEST_F(FormatTest, AlignConsecutiveDeclarations) { Index: clang/lib/Format/WhitespaceManager.cpp =================================================================== --- clang/lib/Format/WhitespaceManager.cpp +++ clang/lib/Format/WhitespaceManager.cpp @@ -410,8 +410,11 @@ unsigned ChangeMinColumn = Changes[i].StartOfTokenColumn; int LineLengthAfter = -Changes[i].Spaces; - for (unsigned j = i; j != e && Changes[j].NewlinesBefore == 0; ++j) - LineLengthAfter += Changes[j].Spaces + Changes[j].TokenLength; + for (unsigned j = i; j != e && Changes[j].NewlinesBefore == 0; ++j) { + LineLengthAfter += Changes[j].Spaces; + if (!Changes[j].IsInsideToken) + LineLengthAfter += Changes[j].TokenLength; + } unsigned ChangeMaxColumn = Style.ColumnLimit - LineLengthAfter; // If we are restricted by the maximum column width, end the sequence.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits