From bd83630f2e322c4abb2ee58897fae348d0c7e5e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 20 Dec 2019 18:31:44 +0100 Subject: [PATCH] Fixed #8990 (False positive: struct member not used (union)) --- lib/checkunusedvar.cpp | 4 ++++ test/testunusedvar.cpp | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 42b507daf..9f4ea36d8 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1221,6 +1221,10 @@ void CheckUnusedVar::checkFunctionVariableUsage() const Token *expr = varDecl ? varDecl : tok->astOperand1(); + // Is variable in lhs a union member? + if (tok->previous() && tok->previous()->variable() && tok->previous()->variable()->nameToken()->scope()->type == Scope::eUnion) + continue; + FwdAnalysis fwdAnalysis(mTokenizer->isCPP(), mSettings->library); if (fwdAnalysis.unusedValue(expr, start, scope->bodyEnd)) { if (!bailoutTypeName.empty() && bailoutTypeName != "auto") { diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 2a0ba8ffe..dbeba8bcd 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -161,6 +161,7 @@ private: TEST_CASE(localvarStruct5); TEST_CASE(localvarStruct6); TEST_CASE(localvarStruct7); + TEST_CASE(localvarStruct8); TEST_CASE(localvarStructArray); TEST_CASE(localvarOp); // Usage with arithmetic operators @@ -3445,6 +3446,25 @@ private: ASSERT_EQUALS("", errout.str()); } + void localvarStruct8() { + functionVariableUsage("struct s {\n" + " union {\n" + " struct {\n" + " int fld1 : 16;\n" + " int fld2 : 16;\n" + " };\n" + " int raw;\n" + " };\n" + "};\n" + "\n" + "void foo() {\n" + " struct s test;\n" + " test.raw = 0x100;\n" + " dostuff(test.fld1, test.fld2);\n" + "}"); + ASSERT_EQUALS("", errout.str()); + } + void localvarStructArray() { // #3633 - detect that struct array is assigned a value functionVariableUsage("void f() {\n"