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

Method isVariableDeclaration

lib/symboldatabase.cpp:5335–5408  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5333}
5334
5335bool Scope::isVariableDeclaration(const Token* const tok, const Token*& vartok, const Token*& typetok) const
5336{
5337 if (!tok)
5338 return false;
5339
5340 const bool isCPP = tok->isCpp();
5341
5342 if (isCPP && Token::Match(tok, "throw|new"))
5343 return false;
5344
5345 const bool isCPP11 = isCPP && symdb.mSettings.standards.cpp >= Standards::CPP11;
5346
5347 if (isCPP11 && tok->str() == "using")
5348 return false;
5349
5350 const Token* localTypeTok = skipScopeIdentifiers(tok);
5351 const Token* localVarTok = nullptr;
5352
5353 while (Token::simpleMatch(localTypeTok, "alignas (") && Token::Match(localTypeTok->linkAt(1), ") %name%"))
5354 localTypeTok = localTypeTok->linkAt(1)->next();
5355
5356 if (Token::Match(localTypeTok, "%type% <")) {
5357 if (Token::Match(tok, "const_cast|dynamic_cast|reinterpret_cast|static_cast <"))
5358 return false;
5359
5360 const Token* closeTok = localTypeTok->linkAt(1);
5361 if (closeTok) {
5362 localVarTok = skipPointers(closeTok->next());
5363
5364 if (Token::Match(localVarTok, ":: %type% %name% [;=({]")) {
5365 if (localVarTok->strAt(3) != "(" ||
5366 Token::Match(localVarTok->linkAt(3), "[)}] ;")) {
5367 localTypeTok = localVarTok->next();
5368 localVarTok = localVarTok->tokAt(2);
5369 }
5370 }
5371 }
5372 } else if (Token::Match(localTypeTok, "%type%")) {
5373
5374 if (isCPP11 && Token::simpleMatch(localTypeTok, "decltype (") && Token::Match(localTypeTok->linkAt(1), ") %name%|*|&|&&"))
5375 localVarTok = skipPointersAndQualifiers(localTypeTok->linkAt(1)->next());
5376 else {
5377 localVarTok = skipPointersAndQualifiers(localTypeTok->next());
5378 if (isCPP11 && Token::simpleMatch(localVarTok, "decltype (") && Token::Match(localVarTok->linkAt(1), ") %name%|*|&|&&"))
5379 localVarTok = skipPointersAndQualifiers(localVarTok->linkAt(1)->next());
5380 }
5381 }
5382
5383 if (!localVarTok)
5384 return false;
5385
5386 if (Token::simpleMatch(localVarTok, "( *") && Token::Match(localTypeTok->previous(), "class|struct|union|enum")) // not a function call
5387 localVarTok = localVarTok->next();
5388 while (Token::Match(localVarTok, "const|*|&"))
5389 localVarTok = localVarTok->next();
5390
5391 if (Token::Match(localVarTok, "%name% ;|=") || (localVarTok && localVarTok->varId() && localVarTok->strAt(1) == ":")) {
5392 vartok = localVarTok;

Calls 8

skipScopeIdentifiersFunction · 0.85
skipPointersFunction · 0.85
linkAtMethod · 0.80
nextMethod · 0.80
simpleMatchFunction · 0.70
strMethod · 0.45
tokAtMethod · 0.45