summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2015-05-18 12:52:00 +0000
committerDaniel Jasper <djasper@google.com>2015-05-18 12:52:00 +0000
commitadba2aadf29228a501988cccc67e8aeeab025087 (patch)
tree48b937ff1ab62f476f924ed2225bfa171391336a /clang/lib
parentcbb227b48d61a122d816b595479034841df2d4b4 (diff)
downloadbcm5719-llvm-adba2aadf29228a501988cccc67e8aeeab025087.tar.gz
bcm5719-llvm-adba2aadf29228a501988cccc67e8aeeab025087.zip
clang-format: Allow braced initializers in template arguments of class
specializations. Before: template <class T> struct S < std::is_arithmetic<T> { } > {}; After: template <class T> struct S<std::is_arithmetic<T>{}> {}; llvm-svn: 237565
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Format/UnwrappedLineParser.cpp22
-rw-r--r--clang/lib/Format/UnwrappedLineParser.h4
2 files changed, 14 insertions, 12 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index b596553bc01..d0a8cfbe69f 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -302,7 +302,7 @@ void UnwrappedLineParser::parseLevel(bool HasOpeningBrace) {
} while (!eof());
}
-void UnwrappedLineParser::calculateBraceTypes() {
+void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
// We'll parse forward through the tokens until we hit
// a closing brace or eof - note that getNextToken() will
// parse macros, so this will magically work inside macro
@@ -348,9 +348,10 @@ void UnwrappedLineParser::calculateBraceTypes() {
//
// We exclude + and - as they can be ObjC visibility modifiers.
ProbablyBracedList =
- NextTok->isOneOf(tok::comma, tok::semi, tok::period, tok::colon,
+ NextTok->isOneOf(tok::comma, tok::period, tok::colon,
tok::r_paren, tok::r_square, tok::l_brace,
tok::l_paren, tok::ellipsis) ||
+ (NextTok->is(tok::semi) && !ExpectClassBody) ||
(NextTok->isBinaryOperator() && !NextIsObjCMethod);
}
if (ProbablyBracedList) {
@@ -1015,9 +1016,9 @@ void UnwrappedLineParser::tryToParseJSFunction() {
parseChildBlock();
}
-bool UnwrappedLineParser::tryToParseBracedList() {
+bool UnwrappedLineParser::tryToParseBracedList(bool ExpectClassBody) {
if (FormatTok->BlockKind == BK_Unknown)
- calculateBraceTypes();
+ calculateBraceTypes(ExpectClassBody);
assert(FormatTok->BlockKind != BK_Unknown);
if (FormatTok->BlockKind == BK_Block)
return false;
@@ -1104,9 +1105,8 @@ void UnwrappedLineParser::parseParens() {
tryToParseLambda();
break;
case tok::l_brace:
- if (!tryToParseBracedList()) {
+ if (!tryToParseBracedList())
parseChildBlock();
- }
break;
case tok::at:
nextToken();
@@ -1146,9 +1146,8 @@ void UnwrappedLineParser::parseSquare() {
parseSquare();
break;
case tok::l_brace: {
- if (!tryToParseBracedList()) {
+ if (!tryToParseBracedList())
parseChildBlock();
- }
break;
}
case tok::at:
@@ -1571,8 +1570,11 @@ void UnwrappedLineParser::parseRecord() {
// and thus rule out the record production in case there is no template
// (this would still leave us with an ambiguity between template function
// and class declarations).
- if (FormatTok->Tok.is(tok::colon) || FormatTok->Tok.is(tok::less)) {
- while (!eof() && FormatTok->Tok.isNot(tok::l_brace)) {
+ if (FormatTok->isOneOf(tok::colon, tok::less)) {
+ while (!eof()) {
+ if (FormatTok->is(tok::l_brace) &&
+ !tryToParseBracedList(/*ExpectClassBody=*/true))
+ break;
if (FormatTok->Tok.is(tok::semi))
return;
nextToken();
diff --git a/clang/lib/Format/UnwrappedLineParser.h b/clang/lib/Format/UnwrappedLineParser.h
index 06c80e1387d..a75845f5d83 100644
--- a/clang/lib/Format/UnwrappedLineParser.h
+++ b/clang/lib/Format/UnwrappedLineParser.h
@@ -82,7 +82,7 @@ private:
void parsePPEndIf();
void parsePPUnknown();
void parseStructuralElement();
- bool tryToParseBracedList();
+ bool tryToParseBracedList(bool ExpectClassBody = false);
bool parseBracedList(bool ContinueOnSemicolons = false);
void parseParens();
void parseSquare();
@@ -113,7 +113,7 @@ private:
void readToken();
void flushComments(bool NewlineBeforeNext);
void pushToken(FormatToken *Tok);
- void calculateBraceTypes();
+ void calculateBraceTypes(bool ExpectClassBody);
// Marks a conditional compilation edge (for example, an '#if', '#ifdef',
// '#else' or merge conflict marker). If 'Unreachable' is true, assumes
OpenPOWER on IntegriCloud