diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index ca5646d64..c057c38df 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1195,7 +1195,7 @@ void CheckUnusedVar::checkFunctionVariableUsage() if (isIncrementOrDecrement && tok->astParent() && precedes(tok, tok->astOperand1())) continue; - if (tok->str() == "=" && isRaiiClass(tok->valueType(), mTokenizer->isCPP(), false)) + if (tok->str() == "=" && !(tok->valueType() && tok->valueType()->pointer) && isRaiiClass(tok->valueType(), mTokenizer->isCPP(), false)) continue; const bool isPointer = tok->valueType() && tok->valueType()->pointer; diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 402d6c08b..ac761f61c 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -381,7 +381,6 @@ static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok ++indentlevel; continue; } - tok2 = cond->astParent()->previous(); } else if (conditionIsTrue(cond, state)) { if (inElse) tok2 = tok2->link()->tokAt(-2); diff --git a/test/testastutils.cpp b/test/testastutils.cpp index 0f7564152..7d5535cbc 100644 --- a/test/testastutils.cpp +++ b/test/testastutils.cpp @@ -144,7 +144,7 @@ private: const Token * const tok = (offset < 0) ? tokenizer.list.back()->tokAt(1+offset) : tokenizer.tokens()->tokAt(offset); - return (::isReturnScope)(tok); + return (isReturnScope)(tok); } void isReturnScopeTest() { @@ -176,7 +176,7 @@ private: tokenizer.simplifyTokens1(""); const Token * const tok1 = Token::findsimplematch(tokenizer.tokens(), tokStr1, strlen(tokStr1)); const Token * const tok2 = Token::findsimplematch(tok1->next(), tokStr2, strlen(tokStr2)); - return (::isSameExpression)(false, false, tok1, tok2, library, false, true, nullptr); + return (isSameExpression)(false, false, tok1, tok2, library, false, true, nullptr); } void isSameExpressionTest() { @@ -214,7 +214,7 @@ private: ASSERT_LOC(tokenizer.tokenize(istr, "test.cpp"), file, line); const Token * const tok1 = Token::findsimplematch(tokenizer.tokens(), startPattern, strlen(startPattern)); const Token * const tok2 = Token::findsimplematch(tokenizer.tokens(), endPattern, strlen(endPattern)); - return (::isVariableChanged)(tok1, tok2, 1, false, &settings, true); + return (isVariableChanged)(tok1, tok2, 1, false, &settings, true); } void isVariableChangedTest() { @@ -236,7 +236,7 @@ private: std::istringstream istr(code); ASSERT_LOC(tokenizer.tokenize(istr, "test.cpp"), file, line); const Token * const argtok = Token::findmatch(tokenizer.tokens(), pattern); - return (::isVariableChangedByFunctionCall)(argtok, 0, &settings, inconclusive); + return (isVariableChangedByFunctionCall)(argtok, 0, &settings, inconclusive); } void isVariableChangedByFunctionCallTest() { diff --git a/test/testclangimport.cpp b/test/testclangimport.cpp index 78222c3b7..ec6dc43c0 100644 --- a/test/testclangimport.cpp +++ b/test/testclangimport.cpp @@ -1281,8 +1281,7 @@ private: const Token *tok = Token::findsimplematch(tokenizer.tokens(), "sizeof ("); ASSERT(!!tok); tok = tok->next(); - // TODO ASSERT(tok->hasKnownIntValue()); - // TODO ASSERT_EQUALS(10, tok->getKnownIntValue()); + TODO_ASSERT_EQUALS(true, false, tok->hasKnownIntValue() && tok->getKnownIntValue() == 10); } void valueType1() { diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 3a6679534..2ddb7c2f6 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -131,6 +131,7 @@ private: TEST_CASE(localvar61); // #9407 TEST_CASE(localvar62); // #10824 TEST_CASE(localvar63); // #6928 + TEST_CASE(localvar64); // #9997 TEST_CASE(localvarloops); // loops TEST_CASE(localvaralias1); TEST_CASE(localvaralias2); // ticket #1637 @@ -3485,6 +3486,28 @@ private: ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'x' is assigned a value that is never used.\n", errout.str()); } + void localvar64() { // #9997 + functionVariableUsage("class S {\n" + " ~S();\n" + " S* f();\n" + " S* g(int);\n" + "};\n" + "void h(S* s, bool b) {\n" + " S* p = nullptr;\n" + " S* q = nullptr;\n" + " if (b) {\n" + " p = s;\n" + " q = s->f()->g(-2);\n" + " }\n" + " else\n" + " q = s;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:10]: (style) Variable 'p' is assigned a value that is never used.\n" + "[test.cpp:11]: (style) Variable 'q' is assigned a value that is never used.\n" + "[test.cpp:14]: (style) Variable 'q' is assigned a value that is never used.\n", + errout.str()); + } + void localvarloops() { // loops functionVariableUsage("void fun(int c) {\n"