Tokenizer: Remove redundant assignments and variables
This commit is contained in:
parent
e1efad0c27
commit
e15a16eb15
|
@ -2466,7 +2466,6 @@ bool Tokenizer::simplifyTokenList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simplifyStd();
|
simplifyStd();
|
||||||
|
|
||||||
simplifyNamespaces();
|
simplifyNamespaces();
|
||||||
|
@ -2759,6 +2758,8 @@ bool Tokenizer::simplifyTokenList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
removeRedundantAssignment();
|
||||||
|
|
||||||
simplifyComma();
|
simplifyComma();
|
||||||
if (_settings && _settings->_debug)
|
if (_settings && _settings->_debug)
|
||||||
{
|
{
|
||||||
|
@ -2769,6 +2770,60 @@ bool Tokenizer::simplifyTokenList()
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void Tokenizer::removeRedundantAssignment()
|
||||||
|
{
|
||||||
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
|
{
|
||||||
|
if (tok->str() == "{")
|
||||||
|
tok = tok->link();
|
||||||
|
|
||||||
|
if (Token::Match(tok, ") const| {"))
|
||||||
|
{
|
||||||
|
// parse in this function..
|
||||||
|
std::set<unsigned int> localvars;
|
||||||
|
if (tok->next()->str() == "const")
|
||||||
|
tok = tok->next();
|
||||||
|
const Token * const end = tok->next()->link();
|
||||||
|
for (Token *tok2 = tok->next(); tok2 && tok2 != end; tok2 = tok2->next())
|
||||||
|
{
|
||||||
|
if (Token::Match(tok2, "[;{}] %type% * %var% ;"))
|
||||||
|
{
|
||||||
|
tok2 = tok2->tokAt(3);
|
||||||
|
localvars.insert(tok2->varId());
|
||||||
|
}
|
||||||
|
else if (Token::Match(tok2, "[;{}] %type% %var% ;") && tok2->next()->isStandardType())
|
||||||
|
{
|
||||||
|
tok2 = tok2->tokAt(2);
|
||||||
|
localvars.insert(tok2->varId());
|
||||||
|
}
|
||||||
|
else if (tok2->varId() && !Token::Match(tok2->previous(), "[;{}] %var% = %var% ;"))
|
||||||
|
{
|
||||||
|
localvars.erase(tok2->varId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
localvars.erase(0);
|
||||||
|
if (!localvars.empty())
|
||||||
|
{
|
||||||
|
for (Token *tok2 = tok->next(); tok2 && tok2 != end; tok2 = tok2->next())
|
||||||
|
{
|
||||||
|
if (Token::Match(tok2, "[;{}] %type% %var% ;") && localvars.find(tok2->tokAt(2)->varId()) != localvars.end())
|
||||||
|
{
|
||||||
|
Token::eraseTokens(tok2, tok2->tokAt(3));
|
||||||
|
}
|
||||||
|
else if (Token::Match(tok2, "[;{}] %type% * %var% ;") && localvars.find(tok2->tokAt(3)->varId()) != localvars.end())
|
||||||
|
{
|
||||||
|
Token::eraseTokens(tok2, tok2->tokAt(4));
|
||||||
|
}
|
||||||
|
else if (Token::Match(tok2, "[;{}] %var% = %var% ;") && localvars.find(tok2->next()->varId()) != localvars.end())
|
||||||
|
{
|
||||||
|
Token::eraseTokens(tok2, tok2->tokAt(4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool Tokenizer::removeReduntantConditions()
|
bool Tokenizer::removeReduntantConditions()
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
|
@ -139,6 +139,9 @@ public:
|
||||||
private:
|
private:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/** Remove redundant assignment */
|
||||||
|
void removeRedundantAssignment();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replace sizeof() to appropriate size.
|
* Replace sizeof() to appropriate size.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -292,9 +292,9 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const char code1[] = " void f() { int a; bool use = true; if( use ) a=0; else if( bb ) a=1; else if( cc ) a=33; else { gg = 0; } int c=1; }";
|
const char code1[] = "void f() { int a; bool use = true; if( use ) a=0; else if( bb ) a=1; else if( cc ) a=33; else { gg = 0; } int c=1; }";
|
||||||
const char code2[] = " void f() { int a; bool use = true; { a=0; }int c=1; }";
|
const char code2[] = "void f ( ) { int a ; ; ; { a = 0 ; } int c ; c = 1 ; }";
|
||||||
ASSERT_EQUALS(tok(code2), tok(code1));
|
ASSERT_EQUALS(code2, tok(code1));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -779,7 +779,7 @@ private:
|
||||||
"}\n";
|
"}\n";
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << sizeofFromTokenizer("*");
|
oss << sizeofFromTokenizer("*");
|
||||||
ASSERT_EQUALS("void f ( ) { char * ptrs ; int a ; a = " + oss.str() + " ; }", sizeof_(code));
|
ASSERT_EQUALS("void f ( ) { ; int a ; a = " + oss.str() + " ; }", sizeof_(code));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -956,7 +956,7 @@ private:
|
||||||
|
|
||||||
const char expected[] = "void f ( ) "
|
const char expected[] = "void f ( ) "
|
||||||
"{"
|
"{"
|
||||||
" int * p ;"
|
" ;"
|
||||||
" 4 ; "
|
" 4 ; "
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
|
@ -1122,7 +1122,7 @@ private:
|
||||||
"f<int>(10);";
|
"f<int>(10);";
|
||||||
|
|
||||||
const std::string expected("; f<int> ( 10 ) ; "
|
const std::string expected("; f<int> ( 10 ) ; "
|
||||||
"void f<int> ( int val ) { int a ; }");
|
"void f<int> ( int val ) { ; }");
|
||||||
|
|
||||||
ASSERT_EQUALS(expected, sizeof_(code));
|
ASSERT_EQUALS(expected, sizeof_(code));
|
||||||
}
|
}
|
||||||
|
@ -1941,7 +1941,7 @@ private:
|
||||||
" bool x = false;\n"
|
" bool x = false;\n"
|
||||||
" int b = x ? 44 : 3;\n"
|
" int b = x ? 44 : 3;\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
ASSERT_EQUALS("void f ( ) { bool x ; x = false ; int b ; b = 3 ; }", tok(code));
|
ASSERT_EQUALS("void f ( ) { ; ; int b ; b = 3 ; }", tok(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -3040,7 +3040,7 @@ private:
|
||||||
"}\n"
|
"}\n"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
ASSERT_EQUALS("void f ( ) { bool x ; x = true ; }", tok(code));
|
ASSERT_EQUALS("void f ( ) { ; ; }", tok(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -3053,7 +3053,7 @@ private:
|
||||||
"}\n"
|
"}\n"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
ASSERT_EQUALS("void f ( ) { bool x ; x = false ; { g ( ) ; } }", tok(code));
|
ASSERT_EQUALS("void f ( ) { ; ; { g ( ) ; } }", tok(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -3107,7 +3107,7 @@ private:
|
||||||
const char expected[] = "void f ( ) "
|
const char expected[] = "void f ( ) "
|
||||||
"{ "
|
"{ "
|
||||||
"char buf [ 100 ] ; "
|
"char buf [ 100 ] ; "
|
||||||
"char * p ; p = buf ; "
|
"; ; "
|
||||||
"x ( buf ) ; "
|
"x ( buf ) ; "
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
|
@ -3159,7 +3159,7 @@ private:
|
||||||
const char expected[] = "int * foo ( ) "
|
const char expected[] = "int * foo ( ) "
|
||||||
"{ "
|
"{ "
|
||||||
"int a [ 10 ] ; "
|
"int a [ 10 ] ; "
|
||||||
"int * b ; b = a ; "
|
"; ; "
|
||||||
"return a ; "
|
"return a ; "
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
|
|
|
@ -183,6 +183,8 @@ private:
|
||||||
TEST_CASE(switchCase);
|
TEST_CASE(switchCase);
|
||||||
|
|
||||||
TEST_CASE(functionpointer);
|
TEST_CASE(functionpointer);
|
||||||
|
|
||||||
|
TEST_CASE(removeRedundantAssignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1284,7 +1286,7 @@ private:
|
||||||
const std::string expected("\n\n##file 0\n"
|
const std::string expected("\n\n##file 0\n"
|
||||||
"1: void f ( )\n"
|
"1: void f ( )\n"
|
||||||
"2: {\n"
|
"2: {\n"
|
||||||
"3: int a@1 ; int b@2 ;\n"
|
"3: ; ;\n"
|
||||||
"4: }\n");
|
"4: }\n");
|
||||||
|
|
||||||
ASSERT_EQUALS(expected, actual);
|
ASSERT_EQUALS(expected, actual);
|
||||||
|
@ -1498,7 +1500,7 @@ private:
|
||||||
const std::string expected("\n\n##file 0\n"
|
const std::string expected("\n\n##file 0\n"
|
||||||
"1: void f ( )\n"
|
"1: void f ( )\n"
|
||||||
"2: {\n"
|
"2: {\n"
|
||||||
"3: int a@1 ; int b@2 ;\n"
|
"3: int a@1 ; ;\n"
|
||||||
"4: a@1 = a@1 ;\n"
|
"4: a@1 = a@1 ;\n"
|
||||||
"5: }\n");
|
"5: }\n");
|
||||||
|
|
||||||
|
@ -2007,7 +2009,7 @@ private:
|
||||||
" int x;"
|
" int x;"
|
||||||
" { }"
|
" { }"
|
||||||
"}";
|
"}";
|
||||||
ASSERT_EQUALS("void foo ( ) { if ( x ) { int x ; } { } }", tokenizeAndStringify(code, true));
|
ASSERT_EQUALS("void foo ( ) { if ( x ) { ; } { } }", tokenizeAndStringify(code, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2866,6 +2868,11 @@ private:
|
||||||
ASSERT_EQUALS(" unsigned int* f;", simplifyFunctionPointers("unsigned int (*f)();"));
|
ASSERT_EQUALS(" unsigned int* f;", simplifyFunctionPointers("unsigned int (*f)();"));
|
||||||
ASSERT_EQUALS(" unsigned int** f;", simplifyFunctionPointers("unsigned int * (*f)();"));
|
ASSERT_EQUALS(" unsigned int** f;", simplifyFunctionPointers("unsigned int * (*f)();"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removeRedundantAssignment()
|
||||||
|
{
|
||||||
|
ASSERT_EQUALS("void f ( ) { ; int * q ; ; }", tokenizeAndStringify("void f() { int *p, *q; p = q; }", true));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestTokenizer)
|
REGISTER_TEST(TestTokenizer)
|
||||||
|
|
Loading…
Reference in New Issue