Fixed ticket #3557 (Tokenizer: simplification of '[]' doesn't work well):
extract undefined size array simplification and handle multiple arrays and combos between pointers and arrays, don't handle the definitions as arguments of function.
This commit is contained in:
parent
6906001366
commit
6e164ae7ed
|
@ -3598,13 +3598,7 @@ bool Tokenizer::simplifyTokenList()
|
||||||
|
|
||||||
simplifySizeof();
|
simplifySizeof();
|
||||||
|
|
||||||
// change array to pointer..
|
simplifyUndefinedSizeArray();
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
|
||||||
if (Token::Match(tok, "%type% %var% [ ] [,;=]")) {
|
|
||||||
tok->next()->deleteNext(2);
|
|
||||||
tok->insertToken("*");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace constants..
|
// Replace constants..
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
||||||
|
@ -4732,6 +4726,35 @@ bool Tokenizer::simplifyQuestionMark()
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Tokenizer::simplifyUndefinedSizeArray()
|
||||||
|
{
|
||||||
|
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
||||||
|
if (Token::Match(tok, "%type%")) {
|
||||||
|
Token *tok2 = tok->next();
|
||||||
|
while (tok2 && tok2->str() == "*")
|
||||||
|
tok2 = tok2->next();
|
||||||
|
if (!Token::Match(tok2, "%var% [ ]"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tok = tok2->previous();
|
||||||
|
Token *end = tok2->next();
|
||||||
|
unsigned int count = 0;
|
||||||
|
while (Token::Match(end, "[ ] [;=[]")) {
|
||||||
|
end = end->tokAt(2);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
if (Token::Match(end, "[;=]")) {
|
||||||
|
do {
|
||||||
|
tok2->deleteNext(2);
|
||||||
|
tok->insertToken("*");
|
||||||
|
} while (--count);
|
||||||
|
tok = end;
|
||||||
|
} else
|
||||||
|
tok = tok->tokAt(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Tokenizer::simplifyCasts()
|
void Tokenizer::simplifyCasts()
|
||||||
{
|
{
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
||||||
|
|
|
@ -349,6 +349,11 @@ public:
|
||||||
*/
|
*/
|
||||||
void simplifyCasts();
|
void simplifyCasts();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change (multiple) arrays to (multiple) pointers.
|
||||||
|
*/
|
||||||
|
void simplifyUndefinedSizeArray();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simplify function that replaces a variable with its value in cases
|
* A simplify function that replaces a variable with its value in cases
|
||||||
* when the value is known. e.g. "x=10; if(x)" => "x=10;if(10)"
|
* when the value is known. e.g. "x=10; if(x)" => "x=10;if(10)"
|
||||||
|
|
|
@ -402,6 +402,8 @@ private:
|
||||||
TEST_CASE(removeRedundantFor);
|
TEST_CASE(removeRedundantFor);
|
||||||
|
|
||||||
TEST_CASE(consecutiveBraces);
|
TEST_CASE(consecutiveBraces);
|
||||||
|
|
||||||
|
TEST_CASE(undefinedSizeArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string tok(std::string code, bool simplify = true, Settings::PlatformType type = Settings::Unspecified) {
|
std::string tok(std::string code, bool simplify = true, Settings::PlatformType type = Settings::Unspecified) {
|
||||||
|
@ -7623,6 +7625,15 @@ private:
|
||||||
ASSERT_EQUALS("void f ( ) { for ( ; ; ) { } }", tok("void f () { for(;;){} }", true));
|
ASSERT_EQUALS("void f ( ) { for ( ; ; ) { } }", tok("void f () { for(;;){} }", true));
|
||||||
ASSERT_EQUALS("void f ( ) { { scope_lock lock ; foo ( ) ; } { scope_lock lock ; bar ( ) ; } }", tok("void f () { {scope_lock lock; foo();} {scope_lock lock; bar();} }", true));
|
ASSERT_EQUALS("void f ( ) { { scope_lock lock ; foo ( ) ; } { scope_lock lock ; bar ( ) ; } }", tok("void f () { {scope_lock lock; foo();} {scope_lock lock; bar();} }", true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void undefinedSizeArray() {
|
||||||
|
ASSERT_EQUALS("int * x ;", tok("int x [];"));
|
||||||
|
ASSERT_EQUALS("int * * x ;", tok("int x [][];"));
|
||||||
|
ASSERT_EQUALS("int * * x ;", tok("int * x [];"));
|
||||||
|
ASSERT_EQUALS("int * * * x ;", tok("int * x [][];"));
|
||||||
|
ASSERT_EQUALS("int * * * * x ;", tok("int * * x [][];"));
|
||||||
|
ASSERT_EQUALS("void f ( int x [ ] , double y [ ] ) { }", tok("void f(int x[], double y[]) { }"));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestSimplifyTokens)
|
REGISTER_TEST(TestSimplifyTokens)
|
||||||
|
|
Loading…
Reference in New Issue