From c1237a8b8fb71bace4af3fcd7da91c41cbf107c6 Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Wed, 23 Jan 2013 14:08:21 +0000 Subject: [PATCH] Fixes layouting regression and invalid-read. Layouting would prevent breaking before + in a[b + c] = d; Regression detected by code review. Also fixes an invalid-read found by the valgrind bot. llvm-svn: 173262 --- clang/lib/Format/Format.cpp | 4 +++- clang/lib/Format/UnwrappedLineParser.cpp | 5 ++++- clang/unittests/Format/FormatTest.cpp | 7 +++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index d95deb5..2952067 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1256,8 +1256,10 @@ private: IsExpression = true; AnnotatedToken *Previous = Current.Parent; while (Previous != NULL) { - if (Previous->Type == TT_BinaryOperator) + if (Previous->Type == TT_BinaryOperator && + (Previous->is(tok::star) || Previous->is(tok::amp))) { Previous->Type = TT_PointerOrReference; + } Previous = Previous->Parent; } } diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index c21fa0d..1b39442 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -38,7 +38,10 @@ public: } ~ScopedDeclarationState() { Stack.pop_back(); - Line.MustBeDeclaration = Stack.back(); + if (!Stack.empty()) + Line.MustBeDeclaration = Stack.back(); + else + Line.MustBeDeclaration = true; } private: UnwrappedLine &Line; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index d1af838..806a7eb 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1365,6 +1365,13 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyGoogleFormat("A = new SomeType* [Length]();"); } +TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { + verifyFormat("void f() {\n" + " x[aaaaaaaaa -\n" + " b] = 23;\n" + "}", getLLVMStyleWithColumns(15)); +} + TEST_F(FormatTest, FormatsCasts) { verifyFormat("Type *A = static_cast(P);"); verifyFormat("Type *A = (Type *)P;"); -- 2.7.4