@@ -405,21 +405,19 @@ static Token * findCppTypeInitPar(Token *tok)
405405// X{} X<Y>{} etc
406406static 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 ();
0 commit comments