MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / iscpp11init_impl

Function iscpp11init_impl

lib/tokenlist.cpp:590–679  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

588}
589
590static 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);

Callers 1

iscpp11initFunction · 0.85

Calls 10

precedesFunction · 0.85
findParentFunction · 0.85
findLambdaEndScopeFunction · 0.85
linkAtMethod · 0.80
astParentMethod · 0.80
nextMethod · 0.80
simpleMatchFunction · 0.70
strMethod · 0.45
tokAtMethod · 0.45
isKeywordMethod · 0.45

Tested by

no test coverage detected