@@ -7334,6 +7334,19 @@ void Tokenizer::simplifyVarDecl(const bool only_k_r_fpar)
73347334 simplifyVarDecl (list.front (), nullptr , only_k_r_fpar);
73357335}
73367336
7337+ static Token* isTrailingReturnType (Token* tok)
7338+ {
7339+ while (Token::Match (tok, " %name%|::|>" )) {
7340+ if (Token* open = tok->findOpeningBracket ())
7341+ tok = open->tokAt (-1 );
7342+ else
7343+ tok = tok->tokAt (-1 );
7344+ }
7345+ if (tok && Token::simpleMatch (tok->tokAt (-1 ), " ) ." ))
7346+ return tok->tokAt (-1 );
7347+ return nullptr ;
7348+ }
7349+
73377350// cppcheck-suppress functionConst - has side effects
73387351void Tokenizer::simplifyVarDecl (Token * tokBegin, const Token * const tokEnd, const bool only_k_r_fpar)
73397352{
@@ -7361,14 +7374,16 @@ void Tokenizer::simplifyVarDecl(Token * tokBegin, const Token * const tokEnd, co
73617374 if (!tok->linkAt (1 ))
73627375 syntaxError (tokBegin);
73637376 // Check for lambdas before skipping
7364- if (Token::Match (tok-> tokAt (- 2 ), " ) . %name% " )) { // trailing return type
7377+ if (Token* trailingStart = isTrailingReturnType (tok )) {
73657378 // TODO: support lambda without parameter clause?
7366- Token* lambdaStart = tok-> linkAt (- 2 )->previous ( );
7379+ Token* lambdaStart = trailingStart-> link ( )->tokAt (- 1 );
73677380 if (Token::simpleMatch (lambdaStart, " ]" ))
73687381 lambdaStart = lambdaStart->link ();
73697382 Token* lambdaEnd = findLambdaEndScope (lambdaStart);
73707383 if (lambdaEnd)
73717384 simplifyVarDecl (lambdaEnd->link ()->next (), lambdaEnd, only_k_r_fpar);
7385+ else
7386+ simplifyVarDecl (tok->tokAt (2 ), tok->linkAt (1 ), only_k_r_fpar);
73727387 } else {
73737388 for (Token* tok2 = tok->next (); tok2 != tok->linkAt (1 ); tok2 = tok2->next ()) {
73747389 Token* lambdaEnd = findLambdaEndScope (tok2);
0 commit comments