Fixed #2221 (segmentation fault of cppcheck)
This commit is contained in:
parent
a16c0dbd5e
commit
f1eef49fcb
|
@ -872,7 +872,7 @@ void SymbolDatabase::SpaceInfo::getVarList()
|
||||||
if (!tok->isStandardType())
|
if (!tok->isStandardType())
|
||||||
isClass = true;
|
isClass = true;
|
||||||
|
|
||||||
vartok = tok->tokAt(1);
|
vartok = tok->next();
|
||||||
tok = vartok->next();
|
tok = vartok->next();
|
||||||
}
|
}
|
||||||
else if (Token::Match(tok, "%type% :: %type% %var% ;"))
|
else if (Token::Match(tok, "%type% :: %type% %var% ;"))
|
||||||
|
@ -923,7 +923,7 @@ void SymbolDatabase::SpaceInfo::getVarList()
|
||||||
if (!tok->isStandardType())
|
if (!tok->isStandardType())
|
||||||
isClass = true;
|
isClass = true;
|
||||||
|
|
||||||
vartok = tok->tokAt(1);
|
vartok = tok->next();
|
||||||
tok = vartok->next()->link()->next();
|
tok = vartok->next()->link()->next();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -948,6 +948,10 @@ void SymbolDatabase::SpaceInfo::getVarList()
|
||||||
else if (Token::Match(tok, "%type% :: %type% <") ||
|
else if (Token::Match(tok, "%type% :: %type% <") ||
|
||||||
Token::Match(tok, "%type% <"))
|
Token::Match(tok, "%type% <"))
|
||||||
{
|
{
|
||||||
|
// got an unhandled template?
|
||||||
|
if (tok->str() == "template")
|
||||||
|
continue;
|
||||||
|
|
||||||
// find matching ">"
|
// find matching ">"
|
||||||
int level = 0;
|
int level = 0;
|
||||||
for (; tok; tok = tok->next())
|
for (; tok; tok = tok->next())
|
||||||
|
@ -960,14 +964,26 @@ void SymbolDatabase::SpaceInfo::getVarList()
|
||||||
if (level == 0)
|
if (level == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if (tok->str() == ">>")
|
||||||
|
{
|
||||||
|
level-=2;
|
||||||
|
if (level <= 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (tok->str() == "(")
|
||||||
|
tok = tok->link();
|
||||||
|
|
||||||
|
// don't crash on unhandled templates
|
||||||
|
if (tok->next() == NULL)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (tok && Token::Match(tok, "> %var% ;"))
|
if (tok && (Token::Match(tok, "> %var% ;") || Token::Match(tok, ">> %var% ;")))
|
||||||
{
|
{
|
||||||
isClass = true;
|
isClass = true;
|
||||||
vartok = tok->tokAt(1);
|
vartok = tok->next();
|
||||||
tok = vartok->next();
|
tok = vartok->next();
|
||||||
}
|
}
|
||||||
else if (tok && Token::Match(tok, "> * %var% ;"))
|
else if (tok && (Token::Match(tok, "> * %var% ;") || Token::Match(tok, ">> * %var% ;")))
|
||||||
{
|
{
|
||||||
vartok = tok->tokAt(2);
|
vartok = tok->tokAt(2);
|
||||||
tok = vartok->next();
|
tok = vartok->next();
|
||||||
|
|
|
@ -169,6 +169,7 @@ private:
|
||||||
TEST_CASE(symboldatabase3); // ticket #2000
|
TEST_CASE(symboldatabase3); // ticket #2000
|
||||||
TEST_CASE(symboldatabase4);
|
TEST_CASE(symboldatabase4);
|
||||||
TEST_CASE(symboldatabase5); // ticket #2178
|
TEST_CASE(symboldatabase5); // ticket #2178
|
||||||
|
TEST_CASE(symboldatabase6); // ticket #2221
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check the operator Equal
|
// Check the operator Equal
|
||||||
|
@ -4827,6 +4828,19 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void symboldatabase6()
|
||||||
|
{
|
||||||
|
// ticket #2221 - segmentation fault
|
||||||
|
checkConst("template<int i> class X { };\n"
|
||||||
|
"X< 1>2 > x1;\n"
|
||||||
|
"X<(1>2)> x2;\n"
|
||||||
|
"template<class T> class Y { };\n"
|
||||||
|
"Y<X<1>> x3;\n"
|
||||||
|
"Y<X<6>>1>> x4;\n"
|
||||||
|
"Y<X<(6>>1)>> x5;\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestClass)
|
REGISTER_TEST(TestClass)
|
||||||
|
|
Loading…
Reference in New Issue