diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 6fd0d1b77..933331957 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -696,7 +696,8 @@ static void compileAssign(Token *&tok, std::stack &op, unsigned int dept { compileTernaryOp(tok,op, depth); while (tok) { - if (tok->str() == "=") { + if (tok->str() == "=" || tok->str() == "<<=" || tok->str() == ">>=" || + (tok->str().size() == 2U && tok->str()[1] == '=' && std::strchr("+-*/%&|^",tok->str()[0]))) { compileBinOp(tok, compileTernaryOp, op, depth); } else break; } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index b0455610c..8773e5ab4 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -10219,6 +10219,13 @@ private: if (!tokenList.createTokens(istr,"test.cpp")) return "ERROR"; + for (Token *tok = tokenList.front(); tok; tok = tok->next()) { + if (Token::Match(tok, "%or%|<<|>>|+|-|*|/|%|&|^ =")) { + tok->str(tok->str() + "="); + tok->deleteNext(); + } + } + // Set links.. std::stack links; for (Token *tok = tokenList.front(); tok; tok = tok->next()) { @@ -10265,6 +10272,18 @@ private: ASSERT_EQUALS("a-1+", testAst("-a+1")); ASSERT_EQUALS("ab++-c-", testAst("a-b++-c")); + // assignment operators + ASSERT_EQUALS("ab>>=", testAst("a>>=b;")); + ASSERT_EQUALS("ab<<=", testAst("a<<=b;")); + ASSERT_EQUALS("ab+=", testAst("a+=b;")); + ASSERT_EQUALS("ab-=", testAst("a-=b;")); + ASSERT_EQUALS("ab*=", testAst("a*=b;")); + ASSERT_EQUALS("ab/=", testAst("a/=b;")); + ASSERT_EQUALS("ab%=", testAst("a%=b;")); + ASSERT_EQUALS("ab&=", testAst("a&=b;")); + ASSERT_EQUALS("ab|=", testAst("a|=b;")); + ASSERT_EQUALS("ab^=", testAst("a^=b;")); + ASSERT_EQUALS("a\"\"=", testAst("a=\"\"")); ASSERT_EQUALS("a\'\'=", testAst("a=\'\'")); testAst("char a[1]=\"\";"); // don't crash