Skip to content

Commit c8a7ab8

Browse files
authored
fix #14131: False positive: unusedStructMember with __attribute__((unused)) (danmar#7817)
1 parent e755fdb commit c8a7ab8

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

lib/tokenize.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9296,17 +9296,24 @@ static Token* getVariableTokenAfterAttributes(Token* tok) {
92969296
Token *after = getTokenAfterAttributes(tok, true);
92979297

92989298
// check if after variable name
9299-
if (Token::Match(after, ";|=")) {
9299+
if (Token::Match(after, "[;={]")) {
93009300
Token *prev = tok->previous();
93019301
while (Token::simpleMatch(prev, "]"))
93029302
prev = prev->link()->previous();
93039303
if (Token::Match(prev, "%type%"))
93049304
vartok = prev;
93059305
}
93069306

9307+
93079308
// check if before variable name
9308-
else if (Token::Match(after, "%type%"))
9309-
vartok = after;
9309+
else {
9310+
while (Token::Match(after->next(), "const|volatile|static|*|&|&&|%type%")) {
9311+
after = after->next();
9312+
}
9313+
if (Token::Match(after, "%name%")) {
9314+
vartok = after;
9315+
}
9316+
}
93109317

93119318
return vartok;
93129319
}

test/testunusedvar.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class TestUnusedVar : public TestFixture {
7272
TEST_CASE(structmember27); // #13367
7373
TEST_CASE(structmember28);
7474
TEST_CASE(structmember29); // #14075
75+
TEST_CASE(structmember30); // #14131
7576
TEST_CASE(structmember_macro);
7677
TEST_CASE(structmember_template_argument); // #13887 - do not report that member used in template argument is unused
7778
TEST_CASE(classmember);
@@ -2023,6 +2024,17 @@ class TestUnusedVar : public TestFixture {
20232024
ASSERT_EQUALS("[test.cpp:4:56]: (style) struct member 'S::storage' is never used. [unusedStructMember]\n", errout_str());
20242025
}
20252026

2027+
void structmember30() { // #14131
2028+
checkStructMemberUsage("struct S\n"
2029+
"{\n"
2030+
"private:\n"
2031+
" __attribute__((unused)) int i1{};\n"
2032+
" int __attribute__((unused)) i2{}; // no warning\n"
2033+
" int i3 __attribute__((unused)) {};\n"
2034+
"};\n");
2035+
ASSERT_EQUALS("", errout_str());
2036+
}
2037+
20262038
void structmember_macro() {
20272039
checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n"
20282040
"S(unused);\n");

0 commit comments

Comments
 (0)