| 449 | } |
| 450 | |
| 451 | static Token* skipDecl(Token* tok, std::vector<Token*>* inner = nullptr) |
| 452 | { |
| 453 | auto isDecltypeFuncParam = [](const Token* tok) -> bool { |
| 454 | if (!Token::simpleMatch(tok, ")")) |
| 455 | return false; |
| 456 | tok = tok->next(); |
| 457 | while (Token::Match(tok, "*|&|&&|const")) |
| 458 | tok = tok->next(); |
| 459 | if (Token::simpleMatch(tok, "(")) |
| 460 | tok = tok->link()->next(); |
| 461 | return Token::Match(tok, "%name%| ,|)"); |
| 462 | }; |
| 463 | |
| 464 | if (!Token::Match(tok->previous(), "( %name%")) |
| 465 | return tok; |
| 466 | Token *vartok = tok; |
| 467 | while (Token::Match(vartok, "%name%|*|&|&&|::|<")) { |
| 468 | if (vartok->str() == "<") { |
| 469 | if (vartok->link()) |
| 470 | vartok = vartok->link(); |
| 471 | else |
| 472 | return tok; |
| 473 | } else if (Token::Match(vartok, "%var% [:=({]")) { |
| 474 | return vartok; |
| 475 | } else if (Token::Match(vartok, "decltype|typeof (") && !isDecltypeFuncParam(tok->linkAt(1))) { |
| 476 | if (inner) |
| 477 | inner->push_back(vartok->tokAt(2)); |
| 478 | return vartok->linkAt(1)->next(); |
| 479 | } |
| 480 | vartok = vartok->next(); |
| 481 | } |
| 482 | return tok; |
| 483 | } |
| 484 | |
| 485 | static bool iscast(const Token *tok, bool cpp) |
| 486 | { |