@@ -5150,38 +5150,6 @@ bool Tokenizer::simplifyTokenList1(const char FileName[]) |
5150 | 5150 |
|
5151 | 5151 | return true; |
5152 | 5152 | } |
5153 | | - |
5154 | | -bool Tokenizer::simplifyTokenList2() |
5155 | | -{ |
5156 | | - // clear the _functionList so it can't contain dead pointers |
5157 | | - deleteSymbolDatabase(); |
5158 | | - |
5159 | | - // Clear AST,ValueFlow. These will be created again at the end of this function. |
5160 | | - for (Token *tok = list.front(); tok; tok = tok->next()) { |
5161 | | - tok->clearAst(); |
5162 | | - tok->clearValueFlow(); |
5163 | | - } |
5164 | | - |
5165 | | - if (Settings::terminated()) |
5166 | | - return false; |
5167 | | - |
5168 | | - |
5169 | | - bool modified = true; |
5170 | | - while (modified) { |
5171 | | - if (Settings::terminated()) |
5172 | | - return false; |
5173 | | - |
5174 | | - modified = false; |
5175 | | - modified |= simplifyConstTernaryOp(); |
5176 | | - validate(); |
5177 | | - } |
5178 | | - |
5179 | | - simplifyComma(); |
5180 | | - |
5181 | | - removeRedundantSemicolons(); |
5182 | | - |
5183 | | - return true; |
5184 | | -} |
5185 | 5153 | //--------------------------------------------------------------------------- |
5186 | 5154 |
|
5187 | 5155 | void Tokenizer::printDebugOutput(int simplification) const |
@@ -5873,87 +5841,6 @@ Token *Tokenizer::simplifyAddBracesPair(Token *tok, bool commandWithCondition) |
5873 | 5841 | return tokBracesEnd; |
5874 | 5842 | } |
5875 | 5843 |
|
5876 | | -bool Tokenizer::simplifyConstTernaryOp() |
5877 | | -{ |
5878 | | - bool ret = false; |
5879 | | - const Token *templateParameterEnd = nullptr; // The end of the current template parameter list, if any |
5880 | | - for (Token *tok = list.front(); tok; tok = tok->next()) { |
5881 | | - if (tok->str() == "<" && TemplateSimplifier::templateParameters(tok)) |
5882 | | - templateParameterEnd = tok->findClosingBracket(); |
5883 | | - if (tok == templateParameterEnd) |
5884 | | - templateParameterEnd = nullptr; // End of the current template parameter list |
5885 | | - if (tok->str() != "?") |
5886 | | - continue; |
5887 | | - |
5888 | | - if (!Token::Match(tok->tokAt(-2), "<|=|,|(|[|{|}|;|case|return %bool%|%num%") && |
5889 | | - !Token::Match(tok->tokAt(-4), "<|=|,|(|[|{|}|;|case|return ( %bool%|%num% )")) |
5890 | | - continue; |
5891 | | - |
5892 | | - const int offset = (tok->previous()->str() == ")") ? 2 : 1; |
5893 | | - |
5894 | | - if (tok->strAt(-2*offset) == "<") { |
5895 | | - if (isC() || !TemplateSimplifier::templateParameters(tok->tokAt(-2*offset))) |
5896 | | - continue; // '<' is less than; the condition is not a constant |
5897 | | - } |
5898 | | - |
5899 | | - // Find the token ":" then go to the next token |
5900 | | - Token *colon = skipTernaryOp(tok); |
5901 | | - if (!colon || colon->previous()->str() != ":" || !colon->next()) |
5902 | | - continue; |
5903 | | - |
5904 | | - //handle the GNU extension: "x ? : y" <-> "x ? x : y" |
5905 | | - if (colon->previous() == tok->next()) |
5906 | | - tok->insertToken(tok->strAt(-offset)); |
5907 | | - |
5908 | | - // go back before the condition, if possible |
5909 | | - tok = tok->tokAt(-2); |
5910 | | - if (offset == 2) { |
5911 | | - // go further back before the "(" |
5912 | | - tok = tok->tokAt(-2); |
5913 | | - //simplify the parentheses |
5914 | | - tok->deleteNext(); |
5915 | | - tok->next()->deleteNext(); |
5916 | | - } |
5917 | | - |
5918 | | - if (Token::Match(tok->next(), "false|0")) { |
5919 | | - // Use code after colon, remove code before it. |
5920 | | - Token::eraseTokens(tok, colon); |
5921 | | - |
5922 | | - tok = tok->next(); |
5923 | | - ret = true; |
5924 | | - } |
5925 | | - |
5926 | | - // The condition is true. Delete the operator after the ":".. |
5927 | | - else { |
5928 | | - // delete the condition token and the "?" |
5929 | | - tok->deleteNext(2); |
5930 | | - |
5931 | | - int ternaryOplevel = 0; |
5932 | | - for (const Token *endTok = colon; endTok; endTok = endTok->next()) { |
5933 | | - if (Token::Match(endTok, "(|[|{")) |
5934 | | - endTok = endTok->link(); |
5935 | | - else if (endTok->str() == "<" && (endTok->strAt(1) == ">" || TemplateSimplifier::templateParameters(endTok))) |
5936 | | - endTok = endTok->findClosingBracket(); |
5937 | | - else if (endTok->str() == "?") |
5938 | | - ++ternaryOplevel; |
5939 | | - else if (Token::Match(endTok, ")|}|]|;|,|:|>")) { |
5940 | | - if (endTok->str() == ":" && ternaryOplevel) |
5941 | | - --ternaryOplevel; |
5942 | | - else if (endTok->str() == ">" && !templateParameterEnd) |
5943 | | - ; |
5944 | | - else { |
5945 | | - Token::eraseTokens(colon->tokAt(-2), endTok); |
5946 | | - ret = true; |
5947 | | - break; |
5948 | | - } |
5949 | | - } |
5950 | | - } |
5951 | | - } |
5952 | | - } |
5953 | | - return ret; |
5954 | | -} |
5955 | | - |
5956 | | - |
5957 | 5844 | void Tokenizer::simplifyFunctionParameters() |
5958 | 5845 | { |
5959 | 5846 | for (Token *tok = list.front(); tok; tok = tok->next()) { |
@@ -7352,133 +7239,7 @@ bool Tokenizer::isOneNumber(const std::string &s) |
7352 | 7239 | return false; |
7353 | 7240 | return isNumberOneOf(s, 1L, "1.0"); |
7354 | 7241 | } |
7355 | | - |
7356 | | -void Tokenizer::simplifyComma() |
7357 | | -{ |
7358 | | - bool inReturn = false; |
7359 | | - |
7360 | | - for (Token *tok = list.front(); tok; tok = tok->next()) { |
7361 | | - |
7362 | | - // skip enums |
7363 | | - if (Token::Match(tok, "enum class|struct| %name%| :|{")) { |
7364 | | - skipEnumBody(&tok); |
7365 | | - } |
7366 | | - if (!tok) |
7367 | | - syntaxError(nullptr); // invalid code like in #4195 |
7368 | | - |
7369 | | - if (Token::Match(tok, "(|[") || Token::Match(tok->previous(), "%name%|= {")) { |
7370 | | - tok = tok->link(); |
7371 | | - continue; |
7372 | | - } |
7373 | | - |
7374 | | - if (Token::simpleMatch(tok, "= (") && Token::simpleMatch(tok->linkAt(1), ") {")) { |
7375 | | - tok = tok->linkAt(1)->linkAt(1); |
7376 | | - continue; |
7377 | | - } |
7378 | | - |
7379 | | - // Skip unhandled template specifiers.. |
7380 | | - if (tok->link() && tok->str() == "<") |
7381 | | - tok = tok->link(); |
7382 | | - |
7383 | | - if (tok->str() == "return" && Token::Match(tok->previous(), "[;{}]")) |
7384 | | - inReturn = true; |
7385 | | - |
7386 | | - if (inReturn && Token::Match(tok, "[;{}?:]")) |
7387 | | - inReturn = false; |
7388 | | - |
7389 | | - if (!tok->next() || tok->str() != ",") |
7390 | | - continue; |
7391 | | - |
7392 | | - // We must not accept just any keyword, e.g. accepting int |
7393 | | - // would cause function parameters to corrupt. |
7394 | | - if (isCPP() && tok->strAt(1) == "delete") { |
7395 | | - // Handle "delete a, delete b;" |
7396 | | - tok->str(";"); |
7397 | | - } |
7398 | | - |
7399 | | - if (isCPP() && Token::Match(tok->tokAt(-2), "delete %name% , %name% ;") && |
7400 | | - tok->next()->varId() != 0) { |
7401 | | - // Handle "delete a, b;" - convert to delete a; b; |
7402 | | - tok->str(";"); |
7403 | | - } else if (!inReturn && tok->tokAt(-2)) { |
7404 | | - bool replace = false; |
7405 | | - for (Token *tok2 = tok->previous(); tok2; tok2 = tok2->previous()) { |
7406 | | - if (tok2->str() == "=") { |
7407 | | - // Handle "a = 0, b = 0;" |
7408 | | - replace = true; |
7409 | | - } else if (isCPP() && (Token::Match(tok2, "delete %name%") || |
7410 | | - Token::Match(tok2, "delete [ ] %name%"))) { |
7411 | | - // Handle "delete a, a = 0;" |
7412 | | - replace = true; |
7413 | | - } else if (Token::Match(tok2, "[?:;,{}()]")) { |
7414 | | - if (replace && Token::Match(tok2, "[;{}]")) |
7415 | | - tok->str(";"); |
7416 | | - break; |
7417 | | - } |
7418 | | - } |
7419 | | - } |
7420 | | - |
7421 | | - // find token where return ends and also count commas |
7422 | | - if (inReturn) { |
7423 | | - Token *startFrom = nullptr; // "[;{}]" token before "return" |
7424 | | - Token *endAt = nullptr; // first ";" token after "[;{}] return" |
7425 | | - |
7426 | | - // find "; return" pattern before comma |
7427 | | - for (Token *tok2 = tok->previous(); tok2; tok2 = tok2->previous()) { |
7428 | | - if (tok2->str() == "return") { |
7429 | | - startFrom = tok2->previous(); |
7430 | | - break; |
7431 | | - } |
7432 | | - } |
7433 | | - if (!startFrom) |
7434 | | - // to be very sure... |
7435 | | - return; |
7436 | | - int commaCounter = 0; |
7437 | | - for (Token *tok2 = startFrom->next(); tok2; tok2 = tok2->next()) { |
7438 | | - if (tok2->str() == ";") { |
7439 | | - endAt = tok2; |
7440 | | - break; |
7441 | | - |
7442 | | - } else if (Token::Match(tok2, "(|[") || |
7443 | | - (tok2->str() == "{" && tok2->previous() && tok2->previous()->str() == "=")) { |
7444 | | - tok2 = tok2->link(); |
7445 | | - |
7446 | | - } else if (tok2->str() == ",") { |
7447 | | - ++commaCounter; |
7448 | | - } |
7449 | | - } |
7450 | | - |
7451 | | - if (!endAt) |
7452 | | - //probably a syntax error |
7453 | | - return; |
7454 | | - |
7455 | | - if (commaCounter) { |
7456 | | - // change tokens: |
7457 | | - // "; return a ( ) , b ( ) , c ;" |
7458 | | - // to |
7459 | | - // "; a ( ) ; b ( ) ; return c ;" |
7460 | | - |
7461 | | - // remove "return" |
7462 | | - startFrom->deleteNext(); |
7463 | | - for (Token *tok2 = startFrom->next(); tok2 != endAt; tok2 = tok2->next()) { |
7464 | | - if (Token::Match(tok2, "(|[") || |
7465 | | - (tok2->str() == "{" && tok2->previous() && tok2->previous()->str() == "=")) { |
7466 | | - tok2 = tok2->link(); |
7467 | | - |
7468 | | - } else if (tok2->str() == ",") { |
7469 | | - tok2->str(";"); |
7470 | | - --commaCounter; |
7471 | | - if (commaCounter == 0) { |
7472 | | - tok2->insertToken("return"); |
7473 | | - } |
7474 | | - } |
7475 | | - } |
7476 | | - tok = endAt; |
7477 | | - } |
7478 | | - } |
7479 | | - } |
7480 | | -} |
7481 | | - |
| 7242 | +// ------------------------------------------------------------------------ |
7482 | 7243 | void Tokenizer::checkConfiguration() const |
7483 | 7244 | { |
7484 | 7245 | if (!mSettings->checkConfiguration) |
@@ -9352,12 +9113,6 @@ void Tokenizer::createSymbolDatabase() |
9352 | 9113 | mSymbolDatabase->validate(); |
9353 | 9114 | } |
9354 | 9115 |
|
9355 | | -void Tokenizer::deleteSymbolDatabase() |
9356 | | -{ |
9357 | | - delete mSymbolDatabase; |
9358 | | - mSymbolDatabase = nullptr; |
9359 | | -} |
9360 | | - |
9361 | 9116 | bool Tokenizer::operatorEnd(const Token * tok) const |
9362 | 9117 | { |
9363 | 9118 | if (tok && tok->str() == ")") { |
|