Skip to content

Commit 453058c

Browse files
committed
AST: Better handling of C++11 initializer lists
1 parent 7a0f05a commit 453058c

2 files changed

Lines changed: 19 additions & 13 deletions

File tree

lib/tokenlist.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -405,21 +405,19 @@ static Token * findCppTypeInitPar(Token *tok)
405405
// X{} X<Y>{} etc
406406
static bool iscpp11init(const Token * const tok)
407407
{
408-
const Token *nameToken = nullptr;
409-
if (tok->isName())
410-
nameToken = tok;
411-
else if (Token::Match(tok->previous(), "%name% {"))
412-
nameToken = tok->previous();
413-
else if (tok->linkAt(-1) && Token::simpleMatch(tok->previous(), "> {") && Token::Match(tok->linkAt(-1)->previous(),"%name% <"))
414-
nameToken = tok->linkAt(-1)->previous();
408+
const Token *nameToken = tok;
409+
while (nameToken && nameToken->str() == "{") {
410+
nameToken = nameToken->previous();
411+
if (nameToken && nameToken->str() == "," && Token::simpleMatch(nameToken->previous(), "} ,"))
412+
nameToken = nameToken->linkAt(-1);
413+
}
415414
if (!nameToken)
416415
return false;
417-
418-
if (Token::Match(nameToken, "%name% { ["))
419-
return false;
416+
if (nameToken->str() == ">" && nameToken->link())
417+
nameToken = nameToken->link()->previous();
420418

421419
const Token *endtok = nullptr;
422-
if (Token::Match(nameToken,"%name% {"))
420+
if (Token::Match(nameToken, "%name% { !!["))
423421
endtok = nameToken->linkAt(1);
424422
else if (Token::Match(nameToken,"%name% <") && Token::simpleMatch(nameToken->linkAt(1),"> {"))
425423
endtok = nameToken->linkAt(1)->linkAt(1);
@@ -543,8 +541,14 @@ static void compileTerm(Token *&tok, AST_state& state)
543541
prev = prev->link()->previous();
544542
if (Token::simpleMatch(tok->link(),"} [")) {
545543
tok = tok->next();
546-
} else if (tok->previous() && tok->previous()->isName()) {
547-
compileBinOp(tok, state, compileExpression);
544+
} else if (state.cpp && iscpp11init(tok)) {
545+
if (state.op.empty() || Token::Match(tok->previous(), "[{,]"))
546+
compileUnaryOp(tok, state, compileExpression);
547+
else
548+
compileBinOp(tok, state, compileExpression);
549+
if (Token::simpleMatch(tok, "} ,")) {
550+
tok = tok->next();
551+
}
548552
} else if (!state.inArrayAssignment && !Token::simpleMatch(prev, "=")) {
549553
state.op.push(tok);
550554
tok = tok->link()->next();

test/testtokenize.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8192,6 +8192,8 @@ class TestTokenizer : public TestFixture {
81928192
ASSERT_EQUALS("abc12,{d:?=", testAst("a=b?c<X>{1,2}:d;"));
81938193
ASSERT_EQUALS("a::12,{", testAst("::a{1,2};")); // operator precedence
81948194
ASSERT_EQUALS("Abc({newreturn", testAst("return new A {b(c)};"));
8195+
ASSERT_EQUALS("a{{return", testAst("return{{a}};"));
8196+
ASSERT_EQUALS("a{b{,{return", testAst("return{{a},{b}};"));
81958197
}
81968198

81978199
void astbrackets() { // []

0 commit comments

Comments
 (0)