diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index a3278f3f191..8c89680dfee 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1732,7 +1732,7 @@ void SymbolDatabase::createSymbolDatabaseExprIds() } else if (tok->astParent() && !tok->astOperand1() && !tok->astOperand2()) { if (tok->tokType() == Token::Type::eBracket) continue; - if (tok->astParent()->isAssignmentOp()) + if (tok->astParent()->str() == "=") continue; if (tok->isControlFlowKeyword()) continue; diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp index 030f46f3f9c..86dde6e17f4 100644 --- a/test/cfg/std.cpp +++ b/test/cfg/std.cpp @@ -603,7 +603,7 @@ void nullPointer_localtime_s(const std::time_t *restrict time, struct tm *restri (void)std::localtime_s(time, result); } -void memleak_localtime_s(const std::time_t *restrict time, struct tm *restrict result) +void memleak_localtime_s(const std::time_t *restrict time, struct tm *restrict result) // #9258 { const time_t t = time(0); const struct tm* const now = new tm(); diff --git a/test/testvarid.cpp b/test/testvarid.cpp index 29f46352ad4..42752d98906 100644 --- a/test/testvarid.cpp +++ b/test/testvarid.cpp @@ -242,6 +242,7 @@ class TestVarID : public TestFixture { TEST_CASE(exprid5); TEST_CASE(exprid6); TEST_CASE(exprid7); + TEST_CASE(exprid8); TEST_CASE(structuredBindings); } @@ -3957,6 +3958,18 @@ class TestVarID : public TestFixture { ASSERT_EQUALS(expected, tokenizeExpr(code)); } + void exprid8() { + const char code[] = "void f() {\n" // #12249 + " std::string s;\n" + " (((s += \"--\") += std::string()) += \"=\");\n" + "}\n"; + const char expected[] = "1: void f ( ) {\n" + "2: std ::@UNIQUE string s@1 ;\n" + "3: ( ( s@1 +=@UNIQUE \"--\"@UNIQUE ) +=@UNIQUE std ::@UNIQUE string (@UNIQUE ) ) +=@UNIQUE \"=\"@UNIQUE ;\n" + "4: }\n"; + ASSERT_EQUALS(expected, tokenizeExpr(code)); + } + void structuredBindings() { const char code[] = "int foo() { auto [x,y] = xy(); return x+y; }"; ASSERT_EQUALS("1: int foo ( ) { auto [ x@1 , y@2 ] = xy ( ) ; return x@1 + y@2 ; }\n",