diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 5dbef87df..d7dbb3976 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -445,7 +445,8 @@ static const Token* doAssignment(Variables &variables, const Token *tok, bool de // not in same scope as declaration else { // no other assignment in this scope - if (var1->_assignments.find(scope) == var1->_assignments.end()) { + if (var1->_assignments.find(scope) == var1->_assignments.end() || + scope->type == Scope::eSwitch) { // nothing to replace if (var1->_assignments.empty()) replace = false; diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 87ffd5ab8..d2fdddee7 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -138,6 +138,7 @@ private: TEST_CASE(localvarFunction); // ticket #1799 TEST_CASE(localvarIfNOT); // #3104 - if ( NOT var ) TEST_CASE(localvarAnd); // #3672 + TEST_CASE(localvarSwitch); // #3744 - false positive when localvar is used in switch } void checkStructMemberUsage(const char code[]) { @@ -3078,6 +3079,22 @@ private: "}"); ASSERT_EQUALS("", errout.str()); } + + void localvarSwitch() { // #3744 - false positive when used in switch + functionVariableUsage("const char *f(int x) {\n" + " const char a[] = \"abc\";\n" + " const char def[] = \"def\";\n" + " const char *ptr;\n" + " switch(x) {\n" + " case 1: ptr=a; break;\n" + " default: ptr=def; break;\n" + " }\n" + " return ptr;\n" + "}"); + + // Don't write an error that "a" is not used + ASSERT_EQUALS("", errout.str()); + } }; REGISTER_TEST(TestUnusedVar)