Skip to content

Commit aaf19c1

Browse files
committed
Fixed #7839 (Prefix increment triggers parameter modification warning)
1 parent f5ad748 commit aaf19c1

2 files changed

Lines changed: 19 additions & 13 deletions

File tree

lib/checkautovariables.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -178,19 +178,20 @@ void CheckAutoVariables::assignFunctionArg()
178178
for (std::size_t i = 0; i < functions; ++i) {
179179
const Scope * scope = symbolDatabase->functionScopes[i];
180180
for (const Token *tok = scope->classStart; tok && tok != scope->classEnd; tok = tok->next()) {
181-
if (Token::Match(tok, "[;{}] %var% =|++|--") || Token::Match(tok, "[;{}] ++|-- %var%")) {
182-
const Token* vartok = tok->next();
183-
if (!vartok->variable())
184-
vartok = vartok->next();
185-
if (isNonReferenceArg(vartok) &&
186-
!Token::Match(vartok->next(), "= %varid% ;", vartok->varId()) &&
187-
!variableIsUsedInScope(Token::findsimplematch(vartok->next(), ";"), vartok->varId(), scope) &&
188-
!Token::findsimplematch(vartok, "goto", scope->classEnd)) {
189-
if (vartok->variable()->isPointer() && printWarning)
190-
errorUselessAssignmentPtrArg(vartok);
191-
else if (printStyle)
192-
errorUselessAssignmentArg(vartok);
193-
}
181+
// TODO: What happens if this is removed?
182+
if (tok->astParent())
183+
continue;
184+
if (!Token::Match(tok, "=|++|--") || !Token::Match(tok->astOperand1(), "%var%"))
185+
continue;
186+
const Token* const vartok = tok->astOperand1();
187+
if (isNonReferenceArg(vartok) &&
188+
!Token::Match(vartok->next(), "= %varid% ;", vartok->varId()) &&
189+
!variableIsUsedInScope(Token::findsimplematch(vartok->next(), ";"), vartok->varId(), scope) &&
190+
!Token::findsimplematch(vartok, "goto", scope->classEnd)) {
191+
if (vartok->variable()->isPointer() && printWarning)
192+
errorUselessAssignmentPtrArg(vartok);
193+
else if (printStyle)
194+
errorUselessAssignmentArg(vartok);
194195
}
195196
}
196197
}

test/testautovariables.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,11 @@ class TestAutoVariables : public TestFixture {
333333
" --ptr;\n"
334334
"}");
335335
ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout.str());
336+
337+
check("void foo(struct S* const x) {\n" // #7839
338+
" ++x->n;\n"
339+
"}");
340+
ASSERT_EQUALS("", errout.str());
336341
}
337342

338343
void testautovar11() { // #4641 - fp, assign local struct member address to function parameter

0 commit comments

Comments
 (0)