| 6671 | } |
| 6672 | |
| 6673 | void Tokenizer::removeMacrosInGlobalScope() |
| 6674 | { |
| 6675 | for (Token *tok = list.front(); tok; tok = tok->next()) { |
| 6676 | if (tok->str() == "(") { |
| 6677 | tok = tok->link(); |
| 6678 | if (Token::Match(tok, ") %type% {") && |
| 6679 | !tok->next()->isStandardType() && |
| 6680 | !tok->next()->isKeyword() && |
| 6681 | !Token::Match(tok->next(), "override|final") && |
| 6682 | tok->next()->isUpperCaseName()) |
| 6683 | tok->deleteNext(); |
| 6684 | } |
| 6685 | |
| 6686 | if (Token::Match(tok, "%type%") && tok->isUpperCaseName() && |
| 6687 | (!tok->previous() || Token::Match(tok->previous(), "[;{}]") || (tok->previous()->isName() && endsWith(tok->strAt(-1), ':')))) { |
| 6688 | const Token *tok2 = tok->next(); |
| 6689 | if (tok2 && tok2->str() == "(") |
| 6690 | tok2 = tok2->link()->next(); |
| 6691 | |
| 6692 | // Several unknown macros... |
| 6693 | while (Token::Match(tok2, "%type% (") && tok2->isUpperCaseName()) |
| 6694 | tok2 = tok2->linkAt(1)->next(); |
| 6695 | |
| 6696 | if (Token::Match(tok, "%name% (") && Token::Match(tok2, "%name% *|&|::|<| %name%") && |
| 6697 | !Token::Match(tok2, "requires|namespace|class|struct|union|private:|protected:|public:")) |
| 6698 | unknownMacroError(tok); |
| 6699 | |
| 6700 | if (Token::Match(tok, "%type% (") && Token::Match(tok2, "%type% (") && !Token::Match(tok2, "noexcept|throw") && TokenList::isFunctionHead(tok2->next(), ":;{")) |
| 6701 | unknownMacroError(tok); |
| 6702 | |
| 6703 | // remove unknown macros before namespace|class|struct|union |
| 6704 | if (Token::Match(tok2, "namespace|class|struct|union")) { |
| 6705 | // is there a "{" for? |
| 6706 | const Token *tok3 = tok2; |
| 6707 | while (tok3 && !Token::Match(tok3,"[;{}()]")) |
| 6708 | tok3 = tok3->next(); |
| 6709 | if (tok3 && tok3->str() == "{") { |
| 6710 | Token::eraseTokens(tok, tok2); |
| 6711 | tok->deleteThis(); |
| 6712 | } |
| 6713 | continue; |
| 6714 | } |
| 6715 | |
| 6716 | // replace unknown macros before foo( |
| 6717 | /* |
| 6718 | if (Token::Match(tok2, "%type% (") && TokenList::isFunctionHead(tok2->next(), "{")) { |
| 6719 | std::string typeName; |
| 6720 | for (const Token* tok3 = tok; tok3 != tok2; tok3 = tok3->next()) |
| 6721 | typeName += tok3->str(); |
| 6722 | Token::eraseTokens(tok, tok2); |
| 6723 | tok->str(typeName); |
| 6724 | } |
| 6725 | */ |
| 6726 | // remove unknown macros before foo::foo( |
| 6727 | if (Token::Match(tok2, "%type% :: %type%")) { |
| 6728 | const Token *tok3 = tok2; |
| 6729 | while (Token::Match(tok3, "%type% :: %type% ::")) |
| 6730 | tok3 = tok3->tokAt(2); |
nothing calls this directly
no test coverage detected