Fix 10552: Internal error with unusedFunction (#3600)

This commit is contained in:
Paul Fultz II 2021-12-05 08:46:17 -06:00 committed by GitHub
parent 35f14962fc
commit c0af66bb52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 5 deletions

View File

@ -1021,7 +1021,7 @@ void Token::function(const Function *f)
tokType(eName); tokType(eName);
} }
void Token::insertToken(const std::string &tokenStr, const std::string &originalNameStr, bool prepend) Token* Token::insertToken(const std::string& tokenStr, const std::string& originalNameStr, bool prepend)
{ {
Token *newToken; Token *newToken;
if (mStr.empty()) if (mStr.empty())
@ -1072,11 +1072,11 @@ void Token::insertToken(const std::string &tokenStr, const std::string &original
while (Token::Match(tok1->previous(), "const|volatile|final|override|&|&&|noexcept")) while (Token::Match(tok1->previous(), "const|volatile|final|override|&|&&|noexcept"))
tok1 = tok1->previous(); tok1 = tok1->previous();
if (tok1->strAt(-1) != ")") if (tok1->strAt(-1) != ")")
return; return newToken;
} else if (Token::Match(newToken->tokAt(-2), ":|, %name%")) { } else if (Token::Match(newToken->tokAt(-2), ":|, %name%")) {
tok1 = tok1->tokAt(-2); tok1 = tok1->tokAt(-2);
if (tok1->strAt(-1) != ")") if (tok1->strAt(-1) != ")")
return; return newToken;
} }
if (tok1->strAt(-1) == ">") if (tok1->strAt(-1) == ">")
tok1 = tok1->previous()->findOpeningBracket(); tok1 = tok1->previous()->findOpeningBracket();
@ -1149,6 +1149,7 @@ void Token::insertToken(const std::string &tokenStr, const std::string &original
} }
} }
} }
return newToken;
} }
void Token::eraseTokens(Token *begin, const Token *end) void Token::eraseTokens(Token *begin, const Token *end)

View File

@ -810,7 +810,12 @@ public:
* @param prepend Insert the new token before this token when it's not * @param prepend Insert the new token before this token when it's not
* the first one on the tokens list. * the first one on the tokens list.
*/ */
void insertToken(const std::string &tokenStr, const std::string &originalNameStr=emptyString, bool prepend=false); Token* insertToken(const std::string& tokenStr, const std::string& originalNameStr = emptyString, bool prepend = false);
Token* insertTokenBefore(const std::string& tokenStr, const std::string& originalNameStr = emptyString)
{
return insertToken(tokenStr, originalNameStr, true);
}
Token *previous() const { Token *previous() const {
return mPrevious; return mPrevious;

View File

@ -4540,9 +4540,12 @@ void Tokenizer::createLinks2()
continue; continue;
} }
if (token->str() == ">>") { if (token->str() == ">>" && top1 && top2) {
type.pop(); type.pop();
type.pop(); type.pop();
// Split the angle brackets
token->str(">");
Token::createMutualLinks(top1, token->insertTokenBefore(">"));
Token::createMutualLinks(top2, token); Token::createMutualLinks(top2, token);
if (templateTokens.size() == 2 && (top1 == templateTokens.top() || top2 == templateTokens.top())) { if (templateTokens.size() == 2 && (top1 == templateTokens.top() || top2 == templateTokens.top())) {
templateTokens.pop(); templateTokens.pop();

View File

@ -3336,6 +3336,32 @@ private:
ASSERT_EQUALS(true, tok2->link() == tok1); ASSERT_EQUALS(true, tok2->link() == tok1);
} }
{
// #10552
const char code[] = "v.value<QPair<int, int>>()\n";
errout.str("");
Tokenizer tokenizer(&settings0, this);
std::istringstream istr(code);
ASSERT(tokenizer.tokenize(istr, "test.cpp"));
const Token* tok1 = Token::findsimplematch(tokenizer.tokens(), "< QPair");
const Token* tok2 = Token::findsimplematch(tok1, "> (");
ASSERT_EQUALS(true, tok1->link() == tok2);
ASSERT_EQUALS(true, tok2->link() == tok1);
}
{
// #10552
const char code[] = "v.value<QPair<int, int>>()\n";
errout.str("");
Tokenizer tokenizer(&settings0, this);
std::istringstream istr(code);
ASSERT(tokenizer.tokenize(istr, "test.cpp"));
const Token* tok1 = Token::findsimplematch(tokenizer.tokens(), "< int");
const Token* tok2 = Token::findsimplematch(tok1, "> > (");
ASSERT_EQUALS(true, tok1->link() == tok2);
ASSERT_EQUALS(true, tok2->link() == tok1);
}
{ {
// #10615 // #10615
const char code[] = "struct A : public B<__is_constructible()>{};\n"; const char code[] = "struct A : public B<__is_constructible()>{};\n";