[llvm-branch-commits] [clang] f6c231c - [clang-format] Fix crashes in AlignArrayOfStructures (#72520)
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Nov 26 23:33:18 PST 2023
Author: Owen Pan
Date: 2023-11-27T08:33:03+01:00
New Revision: f6c231c15ec8b148917abd26233d8be09db49693
URL: https://github.com/llvm/llvm-project/commit/f6c231c15ec8b148917abd26233d8be09db49693
DIFF: https://github.com/llvm/llvm-project/commit/f6c231c15ec8b148917abd26233d8be09db49693.diff
LOG: [clang-format] Fix crashes in AlignArrayOfStructures (#72520)
Fixed #54815.
Fixed #55269.
Fixed #55493.
Fixed #68431.
Added:
Modified:
clang/lib/Format/WhitespaceManager.cpp
clang/lib/Format/WhitespaceManager.h
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp
index c1016c44a74a70e..ddb55c4d853a6f3 100644
--- a/clang/lib/Format/WhitespaceManager.cpp
+++ b/clang/lib/Format/WhitespaceManager.cpp
@@ -1263,6 +1263,8 @@ void WhitespaceManager::alignArrayInitializersRightJustified(
auto Offset = std::distance(Cells.begin(), CellIter);
for (const auto *Next = CellIter->NextColumnElement; Next;
Next = Next->NextColumnElement) {
+ if (RowCount >= CellDescs.CellCounts.size())
+ break;
auto *Start = (Cells.begin() + RowCount * CellDescs.CellCounts[0]);
auto *End = Start + Offset;
ThisNetWidth = getNetWidth(Start, End, CellDescs.InitialSpaces);
@@ -1324,7 +1326,7 @@ void WhitespaceManager::alignArrayInitializersLeftJustified(
auto Offset = std::distance(Cells.begin(), CellIter);
for (const auto *Next = CellIter->NextColumnElement; Next;
Next = Next->NextColumnElement) {
- if (RowCount > CellDescs.CellCounts.size())
+ if (RowCount >= CellDescs.CellCounts.size())
break;
auto *Start = (Cells.begin() + RowCount * CellDescs.CellCounts[0]);
auto *End = Start + Offset;
diff --git a/clang/lib/Format/WhitespaceManager.h b/clang/lib/Format/WhitespaceManager.h
index df7e9add1cd446f..69398fe411502f1 100644
--- a/clang/lib/Format/WhitespaceManager.h
+++ b/clang/lib/Format/WhitespaceManager.h
@@ -317,7 +317,7 @@ class WhitespaceManager {
auto Offset = std::distance(CellStart, CellStop);
for (const auto *Next = CellStop->NextColumnElement; Next;
Next = Next->NextColumnElement) {
- if (RowCount > MaxRowCount)
+ if (RowCount >= MaxRowCount)
break;
auto Start = (CellStart + RowCount * CellCount);
auto End = Start + Offset;
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index dc867ab13172f1b..072028270da0532 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -20734,6 +20734,11 @@ TEST_F(FormatTest, CatchExceptionReferenceBinding) {
TEST_F(FormatTest, CatchAlignArrayOfStructuresRightAlignment) {
auto Style = getLLVMStyle();
Style.AlignArrayOfStructures = FormatStyle::AIAS_Right;
+ verifyNoCrash("f({\n"
+ "table({}, table({{\"\", false}}, {}))\n"
+ "});",
+ Style);
+
Style.AlignConsecutiveAssignments.Enabled = true;
Style.AlignConsecutiveDeclarations.Enabled = true;
verifyFormat("struct test demo[] = {\n"
@@ -21142,6 +21147,33 @@ TEST_F(FormatTest, CatchAlignArrayOfStructuresLeftAlignment) {
"that really, in any just world, ought to be split over multiple "
"lines\"},{-1, 93463, \"world\"},{7, 5, \"!!\"},};",
Style));
+
+ Style.ColumnLimit = 25;
+ verifyNoCrash("Type foo{\n"
+ " {\n"
+ " 1, // A\n"
+ " 2, // B\n"
+ " 3, // C\n"
+ " },\n"
+ " \"hello\",\n"
+ "};",
+ Style);
+ verifyNoCrash("Type object[X][Y] = {\n"
+ " {{val}, {val}, {val}},\n"
+ " {{val}, {val}, // some comment\n"
+ " {val}}\n"
+ "};",
+ Style);
+
+ Style.ColumnLimit = 120;
+ verifyNoCrash(
+ "T v[] {\n"
+ " { AAAAAAAAAAAAAAAAAAAAAAAAA::aaaaaaaaaaaaaaaaaaa, "
+ "AAAAAAAAAAAAAAAAAAAAAAAAA::aaaaaaaaaaaaaaaaaaaaaaaa, 1, 0.000000000f, "
+ "\"00000000000000000000000000000000000000000000000000000000"
+ "00000000000000000000000000000000000000000000000000000000\" },\n"
+ "};",
+ Style);
}
TEST_F(FormatTest, UnderstandsPragmas) {
More information about the llvm-branch-commits
mailing list