diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 504b780d7..da1a9f221 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -943,10 +943,11 @@ static bool isForLoopCondition(const Token * const tok) parent->astParent()->astParent()->astOperand1()->str() == "for"; } -static bool isZeroConstant(const Token *tok) { - while (tok && tok->isCast()) - tok = tok->astOperand2() ? tok->astOperand2() : tok->astOperand1(); - return Token::simpleMatch(tok, "0") && !tok->isExpandedMacro(); +static bool isZeroConstant(const Token *tok) +{ + while (tok && tok->isCast()) + tok = tok->astOperand2() ? tok->astOperand2() : tok->astOperand1(); + return Token::simpleMatch(tok, "0") && !tok->isExpandedMacro(); } /** diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 4f5fed93f..a52ceda52 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -844,9 +844,10 @@ static void compileTerm(Token *&tok, AST_state& state) } else if (state.cpp && iscpp11init(tok)) { if (state.op.empty() || Token::Match(tok->previous(), "[{,]") || Token::Match(tok->tokAt(-2), "%name% (")) { if (Token::Match(tok, "{ !!}")) { - Token *end = tok->link(); + Token *const end = tok->link(); compileUnaryOp(tok, state, compileExpression); - tok = end; + if (precedes(tok,end)) + tok = end; } else { state.op.push(tok); tok = tok->tokAt(2); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index c7ddfd897..fb43920d3 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -5815,6 +5815,7 @@ private: ASSERT_EQUALS("f1{2{,3{,{x,(", testAst("f({{1},{2},{3}},x);")); ASSERT_EQUALS("a1{ b2{", testAst("auto a{1}; auto b{2};")); ASSERT_EQUALS("var1ab::23,{,{4ab::56,{,{,{", testAst("auto var{{1,a::b{2,3}}, {4,a::b{5,6}}};")); + ASSERT_EQUALS("var{{,{,{{", testAst("auto var{ {{},{}}, {} };")); // Initialization with decltype(expr) instead of a type ASSERT_EQUALS("decltypex((", testAst("decltype(x)();"));