@@ -516,6 +516,47 @@ static bool iscast(const Token *tok)
516516 return false ;
517517}
518518
519+ static const Token* findTypeEnd (const Token* tok)
520+ {
521+ while (Token::Match (tok, " %name%|.|::|<|(|template|decltype|sizeof" )) {
522+ if (Token::Match (tok, " (|<" ))
523+ tok = tok->link ();
524+ if (!tok)
525+ return nullptr ;
526+ tok = tok->next ();
527+ }
528+ return tok;
529+ }
530+
531+ static const Token * findLambdaEndScope (const Token *tok)
532+ {
533+ if (!Token::simpleMatch (tok, " [" ))
534+ return nullptr ;
535+ tok = tok->link ();
536+ if (!Token::Match (tok, " ] (|{" ))
537+ return nullptr ;
538+ tok = tok->linkAt (1 );
539+ if (Token::simpleMatch (tok, " }" ))
540+ return tok;
541+ if (Token::simpleMatch (tok, " ) {" ))
542+ return tok->linkAt (1 );
543+ if (!Token::simpleMatch (tok, " )" ))
544+ return nullptr ;
545+ tok = tok->next ();
546+ while (Token::Match (tok, " mutable|constexpr|constval|noexcept|." )) {
547+ if (Token::simpleMatch (tok, " noexcept (" ))
548+ tok = tok->linkAt (1 );
549+ if (Token::simpleMatch (tok, " ." )) {
550+ tok = findTypeEnd (tok);
551+ break ;
552+ }
553+ tok = tok->next ();
554+ }
555+ if (Token::simpleMatch (tok, " {" ))
556+ return tok->link ();
557+ return nullptr ;
558+ }
559+
519560// int(1), int*(2), ..
520561static Token * findCppTypeInitPar (Token *tok)
521562{
@@ -567,7 +608,7 @@ static bool iscpp11init_impl(const Token * const tok)
567608 nameToken = nameToken->link ()->previous ();
568609
569610 const Token *endtok = nullptr ;
570- if (Token::Match (nameToken, " %name% { !![ " ))
611+ if (Token::Match (nameToken, " %name%|return { " ) && (! Token::simpleMatch (nameToken-> tokAt ( 2 ), " [ " ) || findLambdaEndScope (nameToken-> tokAt ( 2 )) ))
571612 endtok = nameToken->linkAt (1 );
572613 else if (Token::Match (nameToken," %name% <" ) && Token::simpleMatch (nameToken->linkAt (1 )," > {" ))
573614 endtok = nameToken->linkAt (1 )->linkAt (1 );
@@ -584,8 +625,9 @@ static bool iscpp11init_impl(const Token * const tok)
584625 for (const Token *tok2 = nameToken->next (); tok2 != endtok; tok2 = tok2->next ()) {
585626 if (tok2->str () == " ;" )
586627 return false ;
587- if (tok2->str () == " [" && Token::simpleMatch (tok2->link (), " ] (" ) && Token::simpleMatch (tok2->link ()->linkAt (1 ), " ) {" ))
588- tok2 = tok2->link ()->linkAt (1 )->linkAt (1 );
628+ const Token * lambdaEnd = findLambdaEndScope (tok2);
629+ if (lambdaEnd)
630+ tok2 = lambdaEnd;
589631 }
590632 }
591633 // There is no initialisation for example here: 'class Fred {};'
0 commit comments