| 5333 | } |
| 5334 | |
| 5335 | bool 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; |