Skip to content

Commit 376d7f1

Browse files
authored
Fix #14075 (False positive: unusedStructMember, member usage by alignas is ignored) (#7842)
This should be reviewed extra carefully; I used ai to fix the ticket.
1 parent 20bed39 commit 376d7f1

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

lib/checkunusedvar.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,6 +1628,17 @@ void CheckUnusedVar::checkStructMemberUsage()
16281628
break;
16291629
}
16301630
}
1631+
// Member referenced in alignas
1632+
if (tok->hasAttributeAlignas()) {
1633+
const std::vector<std::string> alignasExpressions = tok->getAttributeAlignas();
1634+
use = std::any_of(alignasExpressions.cbegin(),
1635+
alignasExpressions.cend(),
1636+
[&var](const std::string& alignasExpr){
1637+
return alignasExpr == var.name();
1638+
});
1639+
if (use)
1640+
break;
1641+
}
16311642
if (tok->variable() != &var)
16321643
continue;
16331644
if (tok != var.nameToken()) {

test/testunusedvar.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class TestUnusedVar : public TestFixture {
7171
TEST_CASE(structmember26); // #13345
7272
TEST_CASE(structmember27); // #13367
7373
TEST_CASE(structmember28);
74+
TEST_CASE(structmember29); // #14075
7475
TEST_CASE(structmember_macro);
7576
TEST_CASE(structmember_template_argument); // #13887 - do not report that member used in template argument is unused
7677
TEST_CASE(classmember);
@@ -2013,6 +2014,15 @@ class TestUnusedVar : public TestFixture {
20132014
ASSERT_EQUALS("[test.cpp:2:18]: (style) struct member 'S::a' is never used. [unusedStructMember]\n", errout_str());
20142015
}
20152016

2017+
void structmember29() { // #14075 - alignas false positive
2018+
checkStructMemberUsage("struct S {\n"
2019+
" static constexpr size_t cDataAlign = 8;\n"
2020+
" static constexpr size_t cDataSize = 128;\n"
2021+
" alignas(cDataAlign) std::array<uint8_t, cDataSize> storage{};\n"
2022+
"};\n");
2023+
ASSERT_EQUALS("[test.cpp:4:56]: (style) struct member 'S::storage' is never used. [unusedStructMember]\n", errout_str());
2024+
}
2025+
20162026
void structmember_macro() {
20172027
checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n"
20182028
"S(unused);\n");

0 commit comments

Comments
 (0)