Fixed #9084 (Tokenizer::setVarId: Same varid for member variable and argument, unknown template type)

This commit is contained in:
Daniel Marjamäki 2019-05-12 09:10:37 +02:00
parent 4d9b1e6c3d
commit 27fad38e00
2 changed files with 11 additions and 4 deletions

View File

@ -2875,15 +2875,15 @@ static bool setVarIdParseDeclaration(const Token **tok, const std::map<std::stri
const Token *start = *tok; const Token *start = *tok;
if (Token::Match(start->previous(), "%or%|%oror%|&&|&|^|+|-|*|/")) if (Token::Match(start->previous(), "%or%|%oror%|&&|&|^|+|-|*|/"))
return false; return false;
const Token * tok3 = tok2->findClosingBracket(); const Token * const closingBracket = tok2->findClosingBracket();
if (tok3 == nullptr) { /* Ticket #8151 */ if (closingBracket == nullptr) { /* Ticket #8151 */
throw tok2; throw tok2;
} }
tok2 = tok3; tok2 = closingBracket;
if (tok2->str() != ">") if (tok2->str() != ">")
break; break;
singleNameCount = 1; singleNameCount = 1;
if (Token::Match(tok2, "> %name% %or%|%oror%|&&|&|^|+|-|*|/")) if (Token::Match(tok2, "> %name% %or%|%oror%|&&|&|^|+|-|*|/") && !Token::Match(tok2, "> const [*&]"))
return false; return false;
if (Token::Match(tok2, "> %name% )")) { if (Token::Match(tok2, "> %name% )")) {
if (Token::Match(tok2->linkAt(2)->previous(), "if|for|while (")) if (Token::Match(tok2->linkAt(2)->previous(), "if|for|while ("))

View File

@ -93,6 +93,7 @@ private:
TEST_CASE(varid60); // #7267 cast '(unsigned x)10' TEST_CASE(varid60); // #7267 cast '(unsigned x)10'
TEST_CASE(varid61); // #4988 inline function TEST_CASE(varid61); // #4988 inline function
TEST_CASE(varid62); TEST_CASE(varid62);
TEST_CASE(varid63);
TEST_CASE(varid_cpp_keywords_in_c_code); TEST_CASE(varid_cpp_keywords_in_c_code);
TEST_CASE(varid_cpp_keywords_in_c_code2); // #5373: varid=0 for argument called "delete" TEST_CASE(varid_cpp_keywords_in_c_code2); // #5373: varid=0 for argument called "delete"
TEST_CASE(varidFunctionCall1); TEST_CASE(varidFunctionCall1);
@ -1115,6 +1116,12 @@ private:
ASSERT_EQUALS("same varid", compareVaridsForVariable(code, "x")); ASSERT_EQUALS("same varid", compareVaridsForVariable(code, "x"));
} }
void varid63() {
const char code[] = "void f(boost::optional<int> const& x) {}";
const char expected[] = "1: void f ( boost :: optional < int > const & x@1 ) { }\n";
ASSERT_EQUALS(expected, tokenize(code, false));
}
void varid_cpp_keywords_in_c_code() { void varid_cpp_keywords_in_c_code() {
const char code[] = "void f() {\n" const char code[] = "void f() {\n"
" delete d;\n" " delete d;\n"