Fixed #4395 (Wrong simplification of known variables in nested assignment)
This commit is contained in:
parent
5a7ede2563
commit
df03e3a8d2
|
@ -6361,7 +6361,7 @@ bool Tokenizer::simplifyKnownVariablesSimplify(Token **tok2, Token *tok3, unsign
|
|||
|
||||
// Variable is used in calculation..
|
||||
if (((tok3->previous()->varId() > 0) && Token::Match(tok3, ("& " + structname + " %varid%").c_str(), varid)) ||
|
||||
Token::Match(tok3, ("[=+-*/%^|[] " + structname + " %varid% [=?+-*/%^|;])]").c_str(), varid) ||
|
||||
(Token::Match(tok3, ("[=+-*/%^|[] " + structname + " %varid% [=?+-*/%^|;])]").c_str(), varid) && !Token::Match(tok3, ("= " + structname + "%var% =").c_str())) ||
|
||||
Token::Match(tok3, ("[(=+-*/%^|[] " + structname + " %varid% <<|>>").c_str(), varid) ||
|
||||
Token::Match(tok3, ("<<|>> " + structname + " %varid% %op%|;|]|)").c_str(), varid) ||
|
||||
Token::Match(tok3->previous(), ("[=+-*/%^|[] ( " + structname + " %varid% !!=").c_str(), varid)) {
|
||||
|
|
|
@ -169,6 +169,7 @@ private:
|
|||
TEST_CASE(simplifyKnownVariablesIfEq2); // if (a==5) { buf[a++] = 0; }
|
||||
TEST_CASE(simplifyKnownVariablesBailOutAssign1);
|
||||
TEST_CASE(simplifyKnownVariablesBailOutAssign2);
|
||||
TEST_CASE(simplifyKnownVariablesBailOutAssign3); // #4395 - nested assignments
|
||||
TEST_CASE(simplifyKnownVariablesBailOutFor1);
|
||||
TEST_CASE(simplifyKnownVariablesBailOutFor2);
|
||||
TEST_CASE(simplifyKnownVariablesBailOutFor3);
|
||||
|
@ -2600,6 +2601,20 @@ private:
|
|||
ASSERT_EQUALS(expected, tokenizeAndStringify(code, true));
|
||||
}
|
||||
|
||||
void simplifyKnownVariablesBailOutAssign3() { // #4395 - nested assignments
|
||||
const char code[] = "void f() {\n"
|
||||
" int *p = 0;\n"
|
||||
" a = p = (VdbeCursor*)pMem->z;\n"
|
||||
" return p ;\n"
|
||||
"}\n";
|
||||
const char expected[] = "void f ( ) {\n"
|
||||
"int * p ; p = 0 ;\n"
|
||||
"a = p = pMem . z ;\n"
|
||||
"return p ;\n"
|
||||
"}";
|
||||
ASSERT_EQUALS(expected, tokenizeAndStringify(code, true));
|
||||
}
|
||||
|
||||
void simplifyKnownVariablesBailOutFor1() {
|
||||
const char code[] = "void foo() {\n"
|
||||
" for (int i = 0; i < 10; ++i) { }\n"
|
||||
|
|
Loading…
Reference in New Issue