10221: Fix setVarId in template code (#3187)
The computation of the classname was not expecting templates. Simply skipping the template part seems to fix the issue.
This commit is contained in:
parent
e23a967215
commit
cddaa6d671
|
@ -4175,7 +4175,7 @@ void Tokenizer::setVarIdPass2()
|
||||||
while (tok->str() == "}" && !scopeInfo.empty() && tok == scopeInfo.back().bodyEnd)
|
while (tok->str() == "}" && !scopeInfo.empty() && tok == scopeInfo.back().bodyEnd)
|
||||||
scopeInfo.pop_back();
|
scopeInfo.pop_back();
|
||||||
|
|
||||||
if (!Token::Match(tok, "namespace|class|struct %name% {|:|::"))
|
if (!Token::Match(tok, "namespace|class|struct %name% {|:|::|<"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const std::string &scopeName(getScopeName(scopeInfo));
|
const std::string &scopeName(getScopeName(scopeInfo));
|
||||||
|
@ -4184,10 +4184,15 @@ void Tokenizer::setVarIdPass2()
|
||||||
std::list<const Token *> classnameTokens;
|
std::list<const Token *> classnameTokens;
|
||||||
classnameTokens.push_back(tok->next());
|
classnameTokens.push_back(tok->next());
|
||||||
const Token* tokStart = tok->tokAt(2);
|
const Token* tokStart = tok->tokAt(2);
|
||||||
while (Token::Match(tokStart, ":: %name%")) {
|
while (Token::Match(tokStart, ":: %name%") || tokStart->str() == "<") {
|
||||||
|
if (tokStart->str() == "<") {
|
||||||
|
// skip the template part
|
||||||
|
tokStart = tokStart->findClosingBracket()->next();
|
||||||
|
} else {
|
||||||
classnameTokens.push_back(tokStart->next());
|
classnameTokens.push_back(tokStart->next());
|
||||||
tokStart = tokStart->tokAt(2);
|
tokStart = tokStart->tokAt(2);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::string classname;
|
std::string classname;
|
||||||
for (const Token *it : classnameTokens)
|
for (const Token *it : classnameTokens)
|
||||||
|
|
|
@ -195,6 +195,7 @@ private:
|
||||||
TEST_CASE(varidclass19); // initializer list
|
TEST_CASE(varidclass19); // initializer list
|
||||||
TEST_CASE(varidclass20); // #7578: int (*p)[2]
|
TEST_CASE(varidclass20); // #7578: int (*p)[2]
|
||||||
TEST_CASE(varid_classnameshaddowsvariablename); // #3990
|
TEST_CASE(varid_classnameshaddowsvariablename); // #3990
|
||||||
|
TEST_CASE(varid_classnametemplate); // #10221
|
||||||
|
|
||||||
TEST_CASE(varidenum1);
|
TEST_CASE(varidenum1);
|
||||||
TEST_CASE(varidenum2);
|
TEST_CASE(varidenum2);
|
||||||
|
@ -3211,6 +3212,37 @@ private:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void varid_classnametemplate() {
|
||||||
|
const char code[] = "template <typename T>\n"
|
||||||
|
"struct BBB {\n"
|
||||||
|
" struct inner;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"template <typename T>\n"
|
||||||
|
"struct BBB<T>::inner {\n"
|
||||||
|
" inner(int x);\n"
|
||||||
|
" int x;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"template <typename T>\n"
|
||||||
|
"BBB<T>::inner::inner(int x): x(x) {}\n";
|
||||||
|
const char expected[] = "1: template < typename T >\n"
|
||||||
|
"2: struct BBB {\n"
|
||||||
|
"3: struct inner ;\n"
|
||||||
|
"4: } ;\n"
|
||||||
|
"5:\n"
|
||||||
|
"6: template < typename T >\n"
|
||||||
|
"7: struct BBB < T > :: inner {\n"
|
||||||
|
"8: inner ( int x@1 ) ;\n"
|
||||||
|
"9: int x@2 ;\n"
|
||||||
|
"10: } ;\n"
|
||||||
|
"11:\n"
|
||||||
|
"12: template < typename T >\n"
|
||||||
|
"13: BBB < T > :: inner :: inner ( int x@3 ) : x@2 ( x@3 ) { }\n";
|
||||||
|
ASSERT_EQUALS(expected, tokenize(code));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void varidnamespace1() {
|
void varidnamespace1() {
|
||||||
const char code[] = "namespace A {\n"
|
const char code[] = "namespace A {\n"
|
||||||
" char buf[20];\n"
|
" char buf[20];\n"
|
||||||
|
|
Loading…
Reference in New Issue