Skip to content

Commit a5db405

Browse files
authored
Fix #14483: false negative: unusedStructMember (member pointer) (#8228)
1 parent b8e9395 commit a5db405

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

lib/symboldatabase.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5266,6 +5266,26 @@ const Variable *Scope::getVariable(const std::string &varname) const
52665266

52675267
static const Token* skipPointers(const Token* tok)
52685268
{
5269+
const Token *start = tok;
5270+
bool memberPointer = false;
5271+
while (tok) {
5272+
if (Token::simpleMatch(tok, "::")) {
5273+
tok = tok->next();
5274+
continue;
5275+
}
5276+
if (Token::Match(tok, "%type% ::")) {
5277+
tok = tok->tokAt(2);
5278+
memberPointer = true;
5279+
continue;
5280+
}
5281+
if (Token::Match(tok, "%type% <") && tok->linkAt(1)) {
5282+
tok = tok->linkAt(1)->next();
5283+
continue;
5284+
}
5285+
break;
5286+
}
5287+
if (memberPointer && !Token::simpleMatch(tok, "*"))
5288+
return start;
52695289
while (Token::Match(tok, "*|&|&&") || (Token::Match(tok, "( [*&]") && Token::Match(tok->link()->next(), "(|["))) {
52705290
tok = tok->next();
52715291
if (tok && tok->strAt(-1) == "(" && Token::Match(tok, "%type% ::"))

test/testother.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10468,7 +10468,7 @@ class TestOther : public TestFixture {
1046810468

1046910469
// Member variable pointers
1047010470
check("void podMemPtrs() {\n"
10471-
" int POD::*memptr;\n"
10471+
" const int POD::*memptr;\n"
1047210472
" memptr = &POD::a;\n"
1047310473
" memptr = &POD::b;\n"
1047410474
" if (memptr)\n"

test/testunusedvar.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ class TestUnusedVar : public TestFixture {
7777
TEST_CASE(structmember29); // #14075
7878
TEST_CASE(structmember30); // #14131
7979
TEST_CASE(structmember31); // #14130
80+
TEST_CASE(structmember32); // #14483
81+
TEST_CASE(structmember33);
8082
TEST_CASE(structmember_macro);
8183
TEST_CASE(structmember_template_argument); // #13887 - do not report that member used in template argument is unused
8284
TEST_CASE(classmember);
@@ -2066,6 +2068,20 @@ class TestUnusedVar : public TestFixture {
20662068
ASSERT_EQUALS("", errout_str());
20672069
}
20682070

2071+
void structmember32() { // #14483
2072+
checkStructMemberUsage("struct S {\n"
2073+
" int S::* mp;\n"
2074+
"};\n");
2075+
ASSERT_EQUALS("[test.cpp:2:12]: (style) struct member 'S::mp' is never used. [unusedStructMember]\n", errout_str());
2076+
}
2077+
2078+
void structmember33() {
2079+
checkStructMemberUsage("struct S {\n"
2080+
" int A::B<int>::C::* mp;\n"
2081+
"};\n");
2082+
ASSERT_EQUALS("[test.cpp:2:23]: (style) struct member 'S::mp' is never used. [unusedStructMember]\n", errout_str());
2083+
}
2084+
20692085
void structmember_macro() {
20702086
checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n"
20712087
"S(unused);\n");

0 commit comments

Comments
 (0)