@@ -4771,6 +4771,7 @@ void Tokenizer::setVarIdPass1()
47714771 std::stack<const Token *> functionDeclEndStack;
47724772 const Token *functionDeclEndToken = nullptr ;
47734773 bool initlist = false ;
4774+ std::stack<const Token *> initlistLambdaEnds; // ends of lambda bodies in an initializer list
47744775 bool inlineFunction = false ;
47754776 for (Token *tok = list.front (); tok; tok = tok->next ()) {
47764777 if (tok->isOp ())
@@ -4843,6 +4844,7 @@ void Tokenizer::setVarIdPass1()
48434844 while (Token::Match (prev, " %name%|." ))
48444845 prev = prev->previous ();
48454846 const bool isLambda = prev && prev->str () == " )" && Token::simpleMatch (prev->link ()->previous (), " ] (" );
4847+ const bool isInitlistLambda = initlist && (isLambda || Token::simpleMatch (prev, " ]" ));
48464848 if ((!isLambda && (tok->strAt (-1 ) == " )" || Token::Match (tok->tokAt (-2 ), " ) %type%" ))) ||
48474849 (initlist && tok->strAt (-1 ) == " }" )) {
48484850 isExecutable = true ;
@@ -4852,8 +4854,10 @@ void Tokenizer::setVarIdPass1()
48524854 if (!(scopeStack.top ().isStructInit || tok->strAt (-1 ) == " =" ))
48534855 variableMap.enterScope ();
48544856 }
4855- const bool isStructInit = scopeStack.top ().isStructInit || tok->strAt (-1 ) == " =" || (initlist && !Token::Match (tok->tokAt (-1 ), " )|}|..." ));
4857+ const bool isStructInit = scopeStack.top ().isStructInit || tok->strAt (-1 ) == " =" || (initlist && !isInitlistLambda && ! Token::Match (tok->tokAt (-1 ), " )|}|..." ));
48564858 scopeStack.emplace (isExecutable, isStructInit, isEnumStart (tok), variableMap.getVarId ());
4859+ if (isInitlistLambda)
4860+ initlistLambdaEnds.push (tok->link ());
48574861 initlist = false ;
48584862 } else { /* if (tok->str() == "}") */
48594863 bool isNamespace = false ;
@@ -4894,6 +4898,11 @@ void Tokenizer::setVarIdPass1()
48944898 if (scopeStack.empty ()) { // should be impossible
48954899 scopeStack.emplace (/* VarIdScopeInfo()*/ );
48964900 }
4901+ if (!initlistLambdaEnds.empty () && initlistLambdaEnds.top () == tok) {
4902+ // continue with the initializer list after the lambda
4903+ initlistLambdaEnds.pop ();
4904+ initlist = true ;
4905+ }
48974906 }
48984907 }
48994908 }
0 commit comments