| 588 | } |
| 589 | |
| 590 | static bool iscpp11init_impl(const Token * const tok) |
| 591 | { |
| 592 | if (Token::simpleMatch(tok, "{") && Token::simpleMatch(tok->link()->previous(), "; }")) |
| 593 | return false; |
| 594 | const Token *nameToken = tok; |
| 595 | while (nameToken && nameToken->str() == "{") { |
| 596 | if (nameToken->isCpp11init() != Token::Cpp11init::UNKNOWN) |
| 597 | return nameToken->isCpp11init() == Token::Cpp11init::CPP11INIT; |
| 598 | nameToken = nameToken->previous(); |
| 599 | } |
| 600 | if (!nameToken) |
| 601 | return false; |
| 602 | if (nameToken->str() == ")" && Token::simpleMatch(nameToken->link()->previous(), "decltype (") && |
| 603 | !Token::simpleMatch(nameToken->link()->tokAt(-2), ".")) |
| 604 | nameToken = nameToken->link()->previous(); |
| 605 | if (Token::simpleMatch(nameToken, ", {")) |
| 606 | return true; |
| 607 | if (nameToken->str() == ">" && nameToken->link()) |
| 608 | nameToken = nameToken->link()->previous(); |
| 609 | if (Token::Match(nameToken, "]|*")) { |
| 610 | const Token* tok2 = nameToken; |
| 611 | if (tok2->link()) { |
| 612 | while (tok2 && precedes(tok2->link(), nameToken)) |
| 613 | tok2 = tok2->link()->previous(); |
| 614 | } |
| 615 | else |
| 616 | tok2 = tok2->previous(); |
| 617 | while (Token::Match(tok2, "%type%|::|*") && !tok2->isKeyword()) |
| 618 | tok2 = tok2->previous(); |
| 619 | if (Token::Match(tok2, "new|%var%")) |
| 620 | return true; |
| 621 | } |
| 622 | |
| 623 | auto isCaseStmt = [](const Token* colonTok) { |
| 624 | if (!Token::Match(colonTok->tokAt(-1), "%name%|%num%|%char%|) :")) |
| 625 | return false; |
| 626 | if (const Token* castTok = colonTok->linkAt(-1)) { |
| 627 | if (Token::simpleMatch(castTok->astParent(), "case")) |
| 628 | return true; |
| 629 | } |
| 630 | if (findParent(colonTok->previous(), [](const Token *parent){ |
| 631 | return parent->str() == "case"; |
| 632 | })) |
| 633 | return true; |
| 634 | const Token* caseTok = colonTok->tokAt(-2); |
| 635 | while (caseTok && Token::Match(caseTok->tokAt(-1), "::|%name%")) |
| 636 | caseTok = caseTok->tokAt(-1); |
| 637 | return Token::simpleMatch(caseTok, "case"); |
| 638 | }; |
| 639 | |
| 640 | const Token *endtok = nullptr; |
| 641 | if (Token::Match(nameToken, "%name%|return|: {") && !isCaseStmt(nameToken) && |
| 642 | (!Token::simpleMatch(nameToken->tokAt(2), "[") || findLambdaEndScope(nameToken->tokAt(2)))) |
| 643 | endtok = nameToken->linkAt(1); |
| 644 | else if (Token::Match(nameToken,"%name% <") && Token::simpleMatch(nameToken->linkAt(1),"> {")) |
| 645 | endtok = nameToken->linkAt(1)->linkAt(1); |
| 646 | else if (Token::Match(nameToken->previous(), "%name%|> ( {")) |
| 647 | endtok = nameToken->linkAt(1); |
no test coverage detected