Fixed #1248 (tokenize typedef of array)
This commit is contained in:
parent
8be54b592d
commit
94d5e32aa1
|
@ -449,11 +449,14 @@ void Tokenizer::simplifyTypedef()
|
|||
bool pointer = false;
|
||||
Token *start = 0;
|
||||
Token *end = 0;
|
||||
Token *num = 0;
|
||||
|
||||
if (Token::Match(tok->next(), "%type% <") ||
|
||||
Token::Match(tok->next(), "%type% :: %type% <") ||
|
||||
Token::Match(tok->next(), "%type% *| %type% ;") ||
|
||||
Token::Match(tok->next(), "%type% %type% *| %type% ;"))
|
||||
Token::Match(tok->next(), "%type% %type% *| %type% ;") ||
|
||||
Token::Match(tok->next(), "%type% *| %type% [ %num% ]") ||
|
||||
Token::Match(tok->next(), "%type% %type% *| %type% [ %num% ]"))
|
||||
{
|
||||
if ((tok->tokAt(2)->str() == "<") ||
|
||||
(tok->tokAt(4) && (tok->tokAt(4)->str() == "<")))
|
||||
|
@ -487,6 +490,48 @@ void Tokenizer::simplifyTypedef()
|
|||
else
|
||||
continue;
|
||||
}
|
||||
else if ((tok->tokAt(3) && tok->tokAt(3)->str() == "[") ||
|
||||
(tok->tokAt(4) && tok->tokAt(4)->str() == "[") ||
|
||||
(tok->tokAt(5) && tok->tokAt(5)->str() == "["))
|
||||
{
|
||||
type1 = tok->strAt(1);
|
||||
|
||||
if ((tok->tokAt(4) && tok->tokAt(4)->str() == "[" && tok->tokAt(2)->str() != "*") ||
|
||||
(tok->tokAt(5) && tok->tokAt(5)->str() == "["))
|
||||
{
|
||||
type2 = tok->strAt(2);
|
||||
pointer = (tok->tokAt(3)->str() == "*");
|
||||
|
||||
if (pointer)
|
||||
{
|
||||
typeName = tok->strAt(4);
|
||||
num = tok->tokAt(6);
|
||||
tok = tok->tokAt(8);
|
||||
}
|
||||
else
|
||||
{
|
||||
typeName = tok->strAt(3);
|
||||
num = tok->tokAt(5);
|
||||
tok = tok->tokAt(7);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pointer = (tok->tokAt(2)->str() == "*");
|
||||
if (pointer)
|
||||
{
|
||||
typeName = tok->strAt(3);
|
||||
num = tok->tokAt(5);
|
||||
tok = tok->tokAt(7);
|
||||
}
|
||||
else
|
||||
{
|
||||
typeName = tok->strAt(2);
|
||||
num = tok->tokAt(4);
|
||||
tok = tok->tokAt(6);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (tok->tokAt(3)->str() == ";")
|
||||
{
|
||||
type1 = tok->strAt(1);
|
||||
|
@ -612,6 +657,17 @@ void Tokenizer::simplifyTypedef()
|
|||
tok2->insertToken("*");
|
||||
tok2 = tok2->next();
|
||||
}
|
||||
|
||||
if (num)
|
||||
{
|
||||
tok2 = tok2->next();
|
||||
tok2->insertToken("[");
|
||||
tok2 = tok2->next();
|
||||
tok2->insertToken(num->strAt(0));
|
||||
tok2 = tok2->next();
|
||||
tok2->insertToken("]");
|
||||
tok2 = tok2->next();
|
||||
}
|
||||
}
|
||||
|
||||
simplifyType = false;
|
||||
|
|
|
@ -148,6 +148,7 @@ private:
|
|||
TEST_CASE(simplifyTypedef11);
|
||||
TEST_CASE(simplifyTypedef12);
|
||||
TEST_CASE(simplifyTypedef13);
|
||||
TEST_CASE(simplifyTypedef14);
|
||||
TEST_CASE(reverseArraySyntax)
|
||||
TEST_CASE(simplify_numeric_condition)
|
||||
|
||||
|
@ -2435,6 +2436,31 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void simplifyTypedef14()
|
||||
{
|
||||
{
|
||||
const char code[] = "typedef char frame[10];\n"
|
||||
"frame f;";
|
||||
|
||||
const char expected[] =
|
||||
"typedef char frame [ 10 ] ; "
|
||||
"char f [ 10 ] ;";
|
||||
|
||||
ASSERT_EQUALS(expected, tok(code, false));
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] = "typedef unsigned char frame[10];\n"
|
||||
"frame f;";
|
||||
|
||||
const char expected[] =
|
||||
"typedef unsigned char frame [ 10 ] ; "
|
||||
"unsigned char f [ 10 ] ;";
|
||||
|
||||
ASSERT_EQUALS(expected, tok(code, false));
|
||||
}
|
||||
}
|
||||
|
||||
void reverseArraySyntax()
|
||||
{
|
||||
ASSERT_EQUALS("a [ 13 ]", tok("13[a]"));
|
||||
|
|
Loading…
Reference in New Issue