Skip to content

Commit 4fa95d1

Browse files
committed
tweak; we can warn about unused union members
1 parent ceb3b15 commit 4fa95d1

2 files changed

Lines changed: 4 additions & 40 deletions

File tree

lib/checkunusedvar.cpp

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,41 +1615,6 @@ void CheckUnusedVar::checkStructMemberUsage()
16151615
}
16161616
}
16171617

1618-
// #7458 - if this is a union and any member is used, don't warn about other members
1619-
bool unionWithUsedMember = false;
1620-
if (scope.type == ScopeType::eUnion) {
1621-
// Check if any direct member of the union is used
1622-
for (const Variable &unionVar : scope.varlist) {
1623-
for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) {
1624-
if (tok->variable() == &unionVar && tok != unionVar.nameToken()) {
1625-
unionWithUsedMember = true;
1626-
break;
1627-
}
1628-
}
1629-
if (unionWithUsedMember)
1630-
break;
1631-
}
1632-
// Also check if any member of nested structs in this union is used
1633-
if (!unionWithUsedMember) {
1634-
for (const Scope *nestedScope : scope.nestedList) {
1635-
if (nestedScope->type == ScopeType::eStruct) {
1636-
for (const Variable &structVar : nestedScope->varlist) {
1637-
for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) {
1638-
if (tok->variable() == &structVar && tok != structVar.nameToken()) {
1639-
unionWithUsedMember = true;
1640-
break;
1641-
}
1642-
}
1643-
if (unionWithUsedMember)
1644-
break;
1645-
}
1646-
if (unionWithUsedMember)
1647-
break;
1648-
}
1649-
}
1650-
}
1651-
}
1652-
16531618
for (const Variable &var : scope.varlist) {
16541619
// only warn for variables without side effects
16551620
if (!var.typeStartToken()->isStandardType() && !var.isPointer() && !astIsContainer(var.nameToken()) && !isRecordTypeWithoutSideEffects(var.type()))
@@ -1667,9 +1632,6 @@ void CheckUnusedVar::checkStructMemberUsage()
16671632
if (structInUnionWithUsedMember)
16681633
continue;
16691634

1670-
// Skip reporting unused members if this is a union and any member is used
1671-
if (unionWithUsedMember)
1672-
continue;
16731635

16741636
// Check if the struct member variable is used anywhere in the file
16751637
bool use = false;

test/testunusedvar.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,14 +1411,16 @@ class TestUnusedVar : public TestFixture {
14111411
" double asDouble;\n"
14121412
" uint64_t asInt;\n"
14131413
" struct {\n"
1414-
" uint32_t lo, hi;\n"
1414+
" uint32_t lo, hi;\n" // <- no FP about lo because hi is used
14151415
" } asIntel;\n"
14161416
"};\n"
14171417
"void f() {\n"
14181418
" union DoubleInt di;\n"
14191419
" di.asIntel.hi = 3;\n"
14201420
"}");
1421-
ASSERT_EQUALS("", errout_str());
1421+
ASSERT_EQUALS("[test.cpp:2:12]: (style) union member 'DoubleInt::asDouble' is never used. [unusedStructMember]\n"
1422+
"[test.cpp:3:14]: (style) union member 'DoubleInt::asInt' is never used. [unusedStructMember]\n",
1423+
errout_str());
14221424
}
14231425

14241426
void structmember2() {

0 commit comments

Comments
 (0)