diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 2eb998fb8e3..0ebdd33aeee 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -1547,8 +1547,12 @@ bool compareTokenFlags(const Token* tok1, const Token* tok2, bool macro) { if (macro) { if (tok1->isExpandedMacro() != tok2->isExpandedMacro()) return false; - if (tok1->isExpandedMacro() && tok1->getMacroName() != tok2->getMacroName()) - return false; + if (tok1->isExpandedMacro()) { // both are macros + if (tok1->getMacroName() != tok2->getMacroName()) + return false; + if (tok1->astParent() && tok2->astParent() && tok1->astParent()->isExpandedMacro() && tok1->astParent()->getMacroName() == tok2->astParent()->getMacroName()) + return false; + } if (tok1->isTemplateArg() || tok2->isTemplateArg()) return false; } diff --git a/test/cfg/bsd.c b/test/cfg/bsd.c index 4727ea6f542..6bc65d641cb 100644 --- a/test/cfg/bsd.c +++ b/test/cfg/bsd.c @@ -32,15 +32,15 @@ void nullPointer_setlinebuf(FILE *stream) // #9323, #9331 void verify_timercmp(struct timeval t) { - // cppcheck-suppress duplicateExpression + // TODO cppcheck-suppress duplicateExpression (void)timercmp(&t, &t, <); - // cppcheck-suppress duplicateExpression + // TODO cppcheck-suppress duplicateExpression (void)timercmp(&t, &t, <=); (void)timercmp(&t, &t, ==); (void)timercmp(&t, &t, !=); - // cppcheck-suppress duplicateExpression + // TODO cppcheck-suppress duplicateExpression (void)timercmp(&t, &t, >=); - // cppcheck-suppress duplicateExpression + // TODO cppcheck-suppress duplicateExpression (void)timercmp(&t, &t, >); } diff --git a/test/testother.cpp b/test/testother.cpp index 8f7fce676ec..53210355aee 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -177,6 +177,7 @@ class TestOther : public TestFixture { TEST_CASE(duplicateExpression15); // #10650 TEST_CASE(duplicateExpression16); // #10569 TEST_CASE(duplicateExpression17); // #12036 + TEST_CASE(duplicateExpression18); TEST_CASE(duplicateExpressionLoop); TEST_CASE(duplicateValueTernary); TEST_CASE(duplicateExpressionTernary); // #6391 @@ -7485,6 +7486,24 @@ class TestOther : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void duplicateExpression18() { + checkP("#if defined(ABC)\n" // #13218 + "#define MACRO1 (0x1)\n" + "#else\n" + "#define MACRO1 (0)\n" + "#endif\n" + "#if defined(XYZ)\n" + "#define MACRO2 (0x2)\n" + "#else\n" + "#define MACRO2 (0)\n" + "#endif\n" + "#define MACRO_ALL (MACRO1 | MACRO2)\n" + "void f() {\n" + " if (MACRO_ALL == 0) {}\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } + void duplicateExpressionLoop() { check("void f() {\n" " int a = 1;\n"