From 56e49c5cc2b05e805c7aa9dc53672711e540d58b Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Mon, 10 Dec 2012 16:34:48 +0000 Subject: [PATCH] Clang-format: error recovery for access specifiers Reviewers: klimek Reviewed By: klimek CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D198 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169738 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/Format.cpp | 5 +++-- lib/Format/UnwrappedLineParser.cpp | 4 +++- unittests/Format/FormatTest.cpp | 24 ++++++++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 3bedc6a4cd..7f1131ca6f 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -371,8 +371,9 @@ private: if (Newlines == 0 && Offset != 0) Newlines = 1; unsigned Indent = Line.Level * 2; - if (Token.Tok.is(tok::kw_public) || Token.Tok.is(tok::kw_protected) || - Token.Tok.is(tok::kw_private)) + if ((Token.Tok.is(tok::kw_public) || Token.Tok.is(tok::kw_protected) || + Token.Tok.is(tok::kw_private)) && + static_cast(Indent) + Style.AccessModifierOffset >= 0) Indent += Style.AccessModifierOffset; replaceWhitespace(Token, Newlines, Indent); return Indent; diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index a225f3b3e7..8545f336b8 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -311,7 +311,9 @@ void UnwrappedLineParser::parseSwitch() { void UnwrappedLineParser::parseAccessSpecifier() { nextToken(); - nextToken(); + // Otherwise, we don't know what it is, and we'd better keep the next token. + if (FormatTok.Tok.is(tok::colon)) + nextToken(); addUnwrappedLine(); } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index d00da7ffee..79cefc4663 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -498,10 +498,26 @@ TEST_F(FormatTest, HandlesIncludeDirectives) { // Error recovery tests. //===----------------------------------------------------------------------===// -//TEST_F(FormatTest, IncorrectDerivedClass) { -// verifyFormat("public B {\n" -// "};"); -//} +TEST_F(FormatTest, IncorrectAccessSpecifier) { + verifyFormat("public:"); + verifyFormat("class A {\n" + "public\n" + " void f() {\n" + " }\n" + "};"); + verifyFormat("public\n" + "int qwerty;"); + verifyFormat("public\n" + "B {\n" + "};"); + verifyFormat("public\n" + "{\n" + "};"); + verifyFormat("public\n" + "B {\n" + " int x;\n" + "};"); +} TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { verifyFormat("{");