fix #2716 (Easy to reproduce crash)

This commit is contained in:
Robert Reif 2011-04-16 10:35:23 -04:00
parent 0beef13794
commit 877a233145
2 changed files with 43 additions and 0 deletions

View File

@ -1476,6 +1476,22 @@ void Tokenizer::simplifyTypedef()
} }
} }
// check for entering a new namespace
else if (Token::Match(tok2, "namespace %any% {"))
{
if (spaceInfo[classLevel].isNamespace &&
spaceInfo[classLevel].className == tok2->next()->str())
{
classLevel++;
pattern.clear();
for (std::size_t i = classLevel; i < spaceInfo.size(); i++)
pattern += (spaceInfo[i].className + " :: ");
pattern += typeName->str();
}
scope++;
}
// check for entering a new scope // check for entering a new scope
else if (tok2->str() == "{") else if (tok2->str() == "{")
{ {

View File

@ -254,6 +254,7 @@ private:
TEST_CASE(simplifyTypedef88); // ticket #2675 TEST_CASE(simplifyTypedef88); // ticket #2675
TEST_CASE(simplifyTypedef89); // ticket #2717 TEST_CASE(simplifyTypedef89); // ticket #2717
TEST_CASE(simplifyTypedef90); // ticket #2718 TEST_CASE(simplifyTypedef90); // ticket #2718
TEST_CASE(simplifyTypedef91); // ticket #2716
TEST_CASE(simplifyTypedefFunction1); TEST_CASE(simplifyTypedefFunction1);
TEST_CASE(simplifyTypedefFunction2); // ticket #1685 TEST_CASE(simplifyTypedefFunction2); // ticket #1685
@ -5112,6 +5113,32 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void simplifyTypedef91() // ticket #2716
{
const char code[] = "namespace NS {\n"
" typedef int (*T)();\n"
" class A {\n"
" T f();\n"
" };\n"
"}\n"
"namespace NS {\n"
" T A::f() {}\n"
"}\n";
const char expected[] = "namespace NS { "
"; "
"class A { "
"int ( * f ( ) ) ( ) ; "
"} ; "
"} "
"namespace NS { "
"int ( * A :: f ( ) ) ( ) { } "
"}";
checkSimplifyTypedef(code);
ASSERT_EQUALS(expected, sizeof_(code));
ASSERT_EQUALS("", errout.str());
}
void simplifyTypedefFunction1() void simplifyTypedefFunction1()
{ {
{ {