Fixed #780 (Tokenizer: replace typedef for pointers to struct)
http://sourceforge.net/apps/trac/cppcheck/ticket/780
This commit is contained in:
parent
803748a654
commit
b0d8b6ca8b
|
@ -372,9 +372,10 @@ void Tokenizer::simplifyTypedef()
|
||||||
const char *type1 = 0;
|
const char *type1 = 0;
|
||||||
const char *type2 = 0;
|
const char *type2 = 0;
|
||||||
const char *typeName = 0;
|
const char *typeName = 0;
|
||||||
|
bool pointer = false;
|
||||||
|
|
||||||
if (Token::Match(tok->next(), "%type% %type% ;") ||
|
if (Token::Match(tok->next(), "%type% %type% ;") ||
|
||||||
Token::Match(tok->next(), "%type% %type% %type% ;"))
|
Token::Match(tok->next(), "%type% %type% *| %type% ;"))
|
||||||
{
|
{
|
||||||
if (tok->tokAt(3)->str() == ";")
|
if (tok->tokAt(3)->str() == ";")
|
||||||
{
|
{
|
||||||
|
@ -385,10 +386,22 @@ void Tokenizer::simplifyTypedef()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
pointer = (tok->tokAt(3)->str() == "*");
|
||||||
|
|
||||||
type1 = tok->strAt(1);
|
type1 = tok->strAt(1);
|
||||||
type2 = tok->strAt(2);
|
type2 = tok->strAt(2);
|
||||||
typeName = tok->strAt(3);
|
|
||||||
tok = tok->tokAt(4);
|
if (pointer)
|
||||||
|
{
|
||||||
|
typeName = tok->strAt(4);
|
||||||
|
tok = tok->tokAt(5);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
typeName = tok->strAt(3);
|
||||||
|
tok = tok->tokAt(4);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string pattern = className + " :: " + typeName;
|
const std::string pattern = className + " :: " + typeName;
|
||||||
|
@ -443,6 +456,11 @@ void Tokenizer::simplifyTypedef()
|
||||||
tok2->insertToken(type2);
|
tok2->insertToken(type2);
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
}
|
}
|
||||||
|
if (pointer)
|
||||||
|
{
|
||||||
|
tok2->insertToken("*");
|
||||||
|
tok2 = tok2->next();
|
||||||
|
}
|
||||||
|
|
||||||
simplifyType = false;
|
simplifyType = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,6 +123,7 @@ private:
|
||||||
TEST_CASE(simplifyTypedef2)
|
TEST_CASE(simplifyTypedef2)
|
||||||
TEST_CASE(simplifyTypedef3)
|
TEST_CASE(simplifyTypedef3)
|
||||||
TEST_CASE(simplifyTypedef4)
|
TEST_CASE(simplifyTypedef4)
|
||||||
|
TEST_CASE(simplifyTypedef5)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string tok(const char code[], bool simplify = true)
|
std::string tok(const char code[], bool simplify = true)
|
||||||
|
@ -1754,6 +1755,26 @@ private:
|
||||||
ASSERT_EQUALS(expected, tok(code, false));
|
ASSERT_EQUALS(expected, tok(code, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void simplifyTypedef5()
|
||||||
|
{
|
||||||
|
// ticket #780
|
||||||
|
const char code[] =
|
||||||
|
"typedef struct yy_buffer_state *YY_BUFFER_STATE;\n"
|
||||||
|
"void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" YY_BUFFER_STATE state;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
const char expected[] =
|
||||||
|
"typedef struct yy_buffer_state * YY_BUFFER_STATE ; "
|
||||||
|
"void f ( ) "
|
||||||
|
"{ "
|
||||||
|
"struct yy_buffer_state * state ; "
|
||||||
|
"}";
|
||||||
|
|
||||||
|
ASSERT_EQUALS(expected, tok(code, false));
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestSimplifyTokens)
|
REGISTER_TEST(TestSimplifyTokens)
|
||||||
|
|
Loading…
Reference in New Issue