diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 5b493dfc2..34f0112be 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -6095,7 +6095,6 @@ void Tokenizer::simplifyVariableMultipleAssign() if (Token::Match(tok, "%var% = %var% = %num% ;") || Token::Match(tok, "%var% = %var% = %var% ;")) { - // skip intermediate assignments Token *tok2 = tok->previous(); while (tok2 && @@ -6105,7 +6104,7 @@ void Tokenizer::simplifyVariableMultipleAssign() tok2 = tok2->tokAt(-2); } - if (tok2->str() != ";") + if (!tok2 || tok2->str() != ";") { continue; } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 3d66b3a99..4a57c3dcc 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -326,6 +326,9 @@ private: // Some simple cleanups of unhandled macros in the global scope TEST_CASE(removeMacrosInGlobalScope); + + // a = b = 0; + TEST_CASE(multipleAssignment); } @@ -5618,6 +5621,11 @@ private: // remove some unhandled macros in the global scope. ASSERT_EQUALS("void f ( ) { }", tokenizeAndStringify("void f() NOTHROW { }")); } + + void multipleAssignment() + { + ASSERT_EQUALS("a = b = 0 ;", tokenizeAndStringify("a=b=0;")); + } }; REGISTER_TEST(TestTokenizer)