diff --git a/lib/astutils.cpp b/lib/astutils.cpp index befd66053..5ee5b3144 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -571,7 +571,9 @@ static const Token * followVariableExpression(const Token * tok, bool cpp, const Token::Match(tok2, "%name% .|[|++|--|%assign%")) { return tok; } - + if (Token::Match(tok2, "%name% (")) + // Bailout when function call is seen + return tok; if (const Variable * var2 = tok2->variable()) { if (!var2->scope()) return tok; diff --git a/test/testother.cpp b/test/testother.cpp index 57fdf3bd1..57eab7eb5 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -140,6 +140,7 @@ private: TEST_CASE(duplicateExpression8); TEST_CASE(duplicateExpression9); // #9320 TEST_CASE(duplicateExpression10); // #9485 + TEST_CASE(duplicateExpression11); // #8916 (function call) TEST_CASE(duplicateExpressionLoop); TEST_CASE(duplicateValueTernary); TEST_CASE(duplicateExpressionTernary); // #6391 @@ -4530,13 +4531,13 @@ private: " const int i = sizeof(int);\n" " if ( i != sizeof (int)){}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'i != sizeof(int)' is always false because 'i' and 'sizeof(int)' represent the same value.\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'i != sizeof(int)' is always false because 'i' and 'sizeof(int)' represent the same value.\n", "", errout.str()); check("void f() {\n" " const int i = sizeof(int);\n" " if ( sizeof (int) != i){}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'sizeof(int) != i' is always false because 'sizeof(int)' and 'i' represent the same value.\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'sizeof(int) != i' is always false because 'sizeof(int)' and 'i' represent the same value.\n", "", errout.str()); check("void f(int a = 1) { if ( a != 1){}}\n"); ASSERT_EQUALS("", errout.str()); @@ -4589,7 +4590,7 @@ private: ASSERT_EQUALS("", errout.str()); check("const int a = 1;\n" - " void f() {\n" + "void f() {\n" " if ( a != 1){} \n" "}\n"); ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout.str()); @@ -4755,6 +4756,27 @@ private: ASSERT_EQUALS("", errout.str()); } + void duplicateExpression11() { + check("class Fred {\n" + "public:\n" + " double getScale() const { return m_range * m_zoom; }\n" + " void setZoom(double z) { m_zoom = z; }\n" + " void dostuff(int);\n" + "private:\n" + " double m_zoom;\n" + " double m_range;\n" + "};\n" + "\n" + "void Fred::dostuff(int x) {\n" + " if (x == 43) {\n" + " double old_scale = getScale();\n" + " setZoom(m_zoom + 1);\n" + " double scale_ratio = getScale() / old_scale;\n" // <- FP + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); + } + void duplicateExpressionLoop() { check("void f() {\n" " int a = 1;\n"