From 729a96b4f2d784b4d22c659adddd935ec8251bd5 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 26 May 2026 13:37:43 +0200 Subject: [PATCH 1/4] Update checkunusedvar.cpp --- lib/checkunusedvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 9531237a208..2eaac319995 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1641,7 +1641,7 @@ void CheckUnusedVar::checkStructMemberUsage() for (const Variable &var : scope.varlist) { // only warn for variables without side effects - if (!var.typeStartToken()->isStandardType() && !var.isPointer() && !astIsContainer(var.nameToken()) && !mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(var.type())) + if (!(var.valueType() && var.valueType()->type >= ValueType::VOID) && !var.isPointer() && !astIsContainer(var.nameToken()) && !mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(var.type())) continue; if (isInherited && !var.isPrivate()) continue; From 72b2e7e75f90543cc4d07d55518b63c89250ed59 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 26 May 2026 13:40:06 +0200 Subject: [PATCH 2/4] Update testunusedvar.cpp --- test/testunusedvar.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 13d288a3fdd..cdc80b8c4d1 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -79,6 +79,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(structmember31); // #14130 TEST_CASE(structmember32); // #14483 TEST_CASE(structmember33); + TEST_CASE(structmember34); TEST_CASE(structmember_macro); TEST_CASE(structmember_template_argument); // #13887 - do not report that member used in template argument is unused TEST_CASE(classmember); @@ -2088,6 +2089,13 @@ class TestUnusedVar : public TestFixture { ASSERT_EQUALS("[test.cpp:2:23]: (style) struct member 'S::mp' is never used. [unusedStructMember]\n", errout_str()); } + void structmember34() { + checkStructMemberUsage("struct S {\n" // #14785 + " std::int32_t i;\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:2:16]: (style) struct member 'S::i' is never used. [unusedStructMember]\n", errout_str()); + } + void structmember_macro() { checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n" "S(unused);\n"); From d1f7aecf8a4bc97509943d0fde3e27c661ff388a Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Tue, 26 May 2026 19:03:19 +0200 Subject: [PATCH 3/4] Trigger CI From bcc97424b89d8d4c47965ece04220ca71780ef70 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Tue, 26 May 2026 23:22:54 +0200 Subject: [PATCH 4/4] Fix #14786 inconsistent unusedStructMember with std::unique_ptr --- lib/checkunusedvar.cpp | 3 ++- test/testunusedvar.cpp | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 2eaac319995..5a171875663 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1641,7 +1641,8 @@ void CheckUnusedVar::checkStructMemberUsage() for (const Variable &var : scope.varlist) { // only warn for variables without side effects - if (!(var.valueType() && var.valueType()->type >= ValueType::VOID) && !var.isPointer() && !astIsContainer(var.nameToken()) && !mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(var.type())) + if (!(var.valueType() && var.valueType()->type >= ValueType::VOID) && !var.isPointer() && !astIsContainer(var.nameToken()) && + !astIsSmartPointer(var.nameToken()) && !mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(var.type())) continue; if (isInherited && !var.isPrivate()) continue; diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index cdc80b8c4d1..b88c05d7a00 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -2094,6 +2094,11 @@ class TestUnusedVar : public TestFixture { " std::int32_t i;\n" "};\n"); ASSERT_EQUALS("[test.cpp:2:16]: (style) struct member 'S::i' is never used. [unusedStructMember]\n", errout_str()); + + checkStructMemberUsage("struct S {\n" // #14786 + " std::unique_ptr p;\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:2:24]: (style) struct member 'S::p' is never used. [unusedStructMember]\n", errout_str()); } void structmember_macro() {