Fixed #1688 (Tokenizer::simplifyKnownVariables and pointer assignments)

This commit is contained in:
Erik Lax 2010-05-16 19:38:44 +02:00 committed by Daniel Marjamäki
parent 01034cd48d
commit 19aaa32a99
2 changed files with 31 additions and 0 deletions

View File

@ -5042,6 +5042,7 @@ bool Tokenizer::simplifyKnownVariables()
std::string value;
Token *tok3 = NULL;
bool valueIsPointer = false;
if (Token::Match(tok2->tokAt(-2), "for ( %varid% = %num% ; %varid% <|<= %num% ; ++| %varid% ++| ) {", varid))
{
@ -5060,7 +5061,15 @@ bool Tokenizer::simplifyKnownVariables()
if (value == "]")
value = tok2->strAt(4);
else if (value == "&")
{
value = tok2->strAt(3);
// *ptr = &var; *ptr = 5;
// equals
// var = 5; not *var = 5;
if (tok2->strAt(4) == ";")
valueIsPointer = true;
}
if (Token::simpleMatch(tok2->next(), "= &"))
tok2 = tok2->tokAt(3);
tok3 = tok2->next();
@ -5184,6 +5193,8 @@ bool Tokenizer::simplifyKnownVariables()
{
tok3 = tok3->next();
tok3->str(value);
if (tok3->previous()->str() == "*" && valueIsPointer)
tok3->previous()->deleteThis();
ret = true;
}

View File

@ -200,6 +200,7 @@ private:
TEST_CASE(pointeralias2);
TEST_CASE(pointeralias3);
TEST_CASE(pointeralias4);
TEST_CASE(pointeralias5);
TEST_CASE(reduceConstness);
@ -4237,6 +4238,25 @@ private:
ASSERT_EQUALS(expected, tok(code));
}
void pointeralias5()
{
const char code[] = "int f()\n"
"{\n"
" int i;\n"
" int *p = &i;\n"
" *p = 5;\n"
" return i;\n"
"}\n";
const char expected[] = "int f ( ) "
"{"
" int i ;"
" int * p ;"
" p = & i ;"
" i = 5 ;"
" return 5 ; "
"}";
ASSERT_EQUALS(expected, tok(code));
}
void reduceConstness()
{