Skip to content

Commit 15a4191

Browse files
Fix #14785/14786 FN unusedStructMember (scoped standard type, smart pointer) (#8576)
Co-authored-by: chrchr-github <noreply@github.com>
1 parent fe41d36 commit 15a4191

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

lib/checkunusedvar.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1641,7 +1641,8 @@ void CheckUnusedVarImpl::checkStructMemberUsage()
16411641

16421642
for (const Variable &var : scope.varlist) {
16431643
// only warn for variables without side effects
1644-
if (!var.typeStartToken()->isStandardType() && !var.isPointer() && !astIsContainer(var.nameToken()) && !mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(var.type()))
1644+
if (!(var.valueType() && var.valueType()->type >= ValueType::VOID) && !var.isPointer() && !astIsContainer(var.nameToken()) &&
1645+
!astIsSmartPointer(var.nameToken()) && !mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(var.type()))
16451646
continue;
16461647
if (isInherited && !var.isPrivate())
16471648
continue;

test/testunusedvar.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class TestUnusedVar : public TestFixture {
7979
TEST_CASE(structmember31); // #14130
8080
TEST_CASE(structmember32); // #14483
8181
TEST_CASE(structmember33);
82+
TEST_CASE(structmember34);
8283
TEST_CASE(structmember_macro);
8384
TEST_CASE(structmember_template_argument); // #13887 - do not report that member used in template argument is unused
8485
TEST_CASE(classmember);
@@ -2088,6 +2089,18 @@ class TestUnusedVar : public TestFixture {
20882089
ASSERT_EQUALS("[test.cpp:2:23]: (style) struct member 'S::mp' is never used. [unusedStructMember]\n", errout_str());
20892090
}
20902091

2092+
void structmember34() {
2093+
checkStructMemberUsage("struct S {\n" // #14785
2094+
" std::int32_t i;\n"
2095+
"};\n");
2096+
ASSERT_EQUALS("[test.cpp:2:16]: (style) struct member 'S::i' is never used. [unusedStructMember]\n", errout_str());
2097+
2098+
checkStructMemberUsage("struct S {\n" // #14786
2099+
" std::unique_ptr<int> p;\n"
2100+
"};\n");
2101+
ASSERT_EQUALS("[test.cpp:2:24]: (style) struct member 'S::p' is never used. [unusedStructMember]\n", errout_str());
2102+
}
2103+
20912104
void structmember_macro() {
20922105
checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n"
20932106
"S(unused);\n");

0 commit comments

Comments
 (0)