diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 92c033918..558f85660 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1122,8 +1122,37 @@ void CheckUnusedVar::checkFunctionVariableUsage() if ((!tok->isAssignmentOp() || !tok->astOperand1()) && !(Token::Match(tok, "%var% (") && tok->variable() && tok->variable()->nameToken() == tok)) continue; if (tok->isName()) { - if (!tok->valueType() || !tok->valueType()->isIntegral()) - continue; + if (mTokenizer->isCPP()) { + // do not check RAII/scope_lock objects + if (!tok->valueType()) + continue; + bool check = false; + switch(tok->valueType()->type) { + case ValueType::Type::UNKNOWN_TYPE: + case ValueType::Type::NONSTD: + case ValueType::Type::RECORD: + check = tok->valueType()->typeScope && tok->valueType()->typeScope->getDestructor(); + break; + case ValueType::Type::CONTAINER: + case ValueType::Type::ITERATOR: + case ValueType::Type::VOID: + case ValueType::Type::BOOL: + case ValueType::Type::CHAR: + case ValueType::Type::SHORT: + case ValueType::Type::WCHAR_T: + case ValueType::Type::INT: + case ValueType::Type::LONG: + case ValueType::Type::LONGLONG: + case ValueType::Type::UNKNOWN_INT: + case ValueType::Type::FLOAT: + case ValueType::Type::DOUBLE: + case ValueType::Type::LONGDOUBLE: + check = true; + break; + }; + if (!check) + continue; + } tok = tok->next(); } if (tok->astParent() && tok->str() != "(") { diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 7221ee0f7..e2f8d3790 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -4124,18 +4124,13 @@ private: functionVariableUsage("void f() {\n" " std::vector x(100);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'x' is assigned a value that is never used.\n", "", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'x' is assigned a value that is never used.\n", errout.str()); functionVariableUsage("void f() {\n" " std::vector x;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (style) Unused variable: x\n", errout.str()); - functionVariableUsage("void f() {\n" - " std::vector x(100);\n" // Might have a side-effect - "}"); - ASSERT_EQUALS("", errout.str()); - functionVariableUsage("void f() {\n" " std::lock_guard lock(mutex_);\n" // Has a side-effect #4385 "}");