diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index e03c7fbb2..07552bd15 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -928,8 +928,11 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const } const Variables::VariableUsage *const var = variables.find(varid); - if (var && !var->_allocateMemory) { - variables.readAll(varid, tok); + if (var) { + if (!var->_aliases.empty()) + variables.use(varid, tok); + else if (!var->_allocateMemory) + variables.readAll(varid, tok); } } diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index e6a9597bc..9f145ca50 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -171,6 +171,7 @@ private: TEST_CASE(localvarTemplate); // #4955 - variable is used as template parameter TEST_CASE(localvarFuncPtr); // #7194 TEST_CASE(localvarAddr); // #7477 + TEST_CASE(localvarDelete); TEST_CASE(localvarCppInitialization); TEST_CASE(localvarCpp11Initialization); @@ -4104,6 +4105,20 @@ private: ASSERT_EQUALS("", errout.str()); } + void localvarDelete() { // #8339 + functionVariableUsage("void reassign(char*& data, int size)" + "{" + " char* buf = new char[size];" + "" + " char* tmp = data;" + " data = buf;" + " buf = tmp;" + "" + " delete [] buf;" + "}"); + ASSERT_EQUALS("", errout.str()); + } + void chainedAssignment() { // #5466 functionVariableUsage("void NotUsed(double* pdD, int n) {\n"