From d9057509820d6ef68e85de6209e97d1a69af943b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 22 Sep 2025 15:49:29 +0200 Subject: [PATCH 1/3] Fix #14075 (False positive: unusedStructMember, member usage by alignas is ignored) --- lib/checkunusedvar.cpp | 9 +++++++++ test/testunusedvar.cpp | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 29b50d5d1cf..07a6a70d8e5 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1628,6 +1628,15 @@ void CheckUnusedVar::checkStructMemberUsage() break; } } + // Member referenced in alignas + if (tok->hasAttributeAlignas()) { + for (const std::string& alignasExpr : tok->getAttributeAlignas()) { + if (alignasExpr == var.name()) { + use = true; + break; + } + } + } if (tok->variable() != &var) continue; if (tok != var.nameToken()) { diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index ae35cdebe99..aef312001d1 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -71,6 +71,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(structmember26); // #13345 TEST_CASE(structmember27); // #13367 TEST_CASE(structmember28); + TEST_CASE(structmember29); // #14075 TEST_CASE(structmember_macro); TEST_CASE(structmember_template_argument); // #13887 - do not report that member used in template argument is unused TEST_CASE(classmember); @@ -2010,6 +2011,15 @@ class TestUnusedVar : public TestFixture { ASSERT_EQUALS("[test.cpp:2:18]: (style) struct member 'S::a' is never used. [unusedStructMember]\n", errout_str()); } + void structmember29() { // #14075 - alignas false positive + checkStructMemberUsage("struct S {\n" + " static constexpr size_t cDataAlign = 8;\n" + " static constexpr size_t cDataSize = 128;\n" + " alignas(cDataAlign) std::array storage{};\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:4:56]: (style) struct member 'S::storage' 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 9c6ed23e7e62b786205f3a6a631f5817aa4dfb69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 22 Sep 2025 19:07:07 +0200 Subject: [PATCH 2/3] useStlAlgorithm --- lib/checkunusedvar.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 07a6a70d8e5..eb88113e9ad 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1630,12 +1630,12 @@ void CheckUnusedVar::checkStructMemberUsage() } // Member referenced in alignas if (tok->hasAttributeAlignas()) { - for (const std::string& alignasExpr : tok->getAttributeAlignas()) { - if (alignasExpr == var.name()) { - use = true; - break; - } - } + const std::vector alignasExpressions = tok->getAttributeAlignas(); + use = std::any_of(alignasExpressions.cbegin(), + alignasExpressions.cend(), + [&var](const std::string& alignasExpr){ return alignasExpr == var.name(); }); + if (use) + break; } if (tok->variable() != &var) continue; From 40b05ecfe11e976d498a5fc1b6792c8507b17868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 23 Sep 2025 04:29:35 +0200 Subject: [PATCH 3/3] runformat --- lib/checkunusedvar.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index eb88113e9ad..d98996d2337 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1633,7 +1633,9 @@ void CheckUnusedVar::checkStructMemberUsage() const std::vector alignasExpressions = tok->getAttributeAlignas(); use = std::any_of(alignasExpressions.cbegin(), alignasExpressions.cend(), - [&var](const std::string& alignasExpr){ return alignasExpr == var.name(); }); + [&var](const std::string& alignasExpr){ + return alignasExpr == var.name(); + }); if (use) break; }