Fixed #3939: Support ****foo++;

This commit is contained in:
anuraggarg011 2012-09-03 17:10:27 +02:00 committed by PKEuS
parent c3a65dca40
commit b156c727b0
2 changed files with 45 additions and 14 deletions

View File

@ -238,21 +238,29 @@ void CheckOther::clarifyStatement()
return;
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) {
if (Token::Match(tok, "[{};] * %var%")) {
tok = tok->tokAt(3);
while (tok) {
if (tok->str() == "[")
tok = tok->link()->next();
if (Token::Match(tok, ".|:: %var%")) {
if (tok->strAt(2) == "(")
tok = tok->linkAt(2)->next();
else
tok = tok->tokAt(2);
} else
break;
if (Token::Match(tok, "* %var%")) {
const Token *tok2=tok->previous();
while (Token::Match(tok2, "*"))
tok2=tok2->previous();
if (Token::Match(tok2, "[{};]")) {
tok = tok->tokAt(2);
while (tok) {
if (tok->str() == "[")
tok = tok->link()->next();
if (Token::Match(tok, ".|:: %var%")) {
if (tok->strAt(2) == "(")
tok = tok->linkAt(2)->next();
else
tok = tok->tokAt(2);
} else
break;
}
if (Token::Match(tok, "++|-- [;,]"))
clarifyStatementError(tok);
}
if (Token::Match(tok, "++|-- [;,]"))
clarifyStatementError(tok);
}
}
}

View File

@ -4040,6 +4040,29 @@ private:
" bar(*c++);\n"
"}");
ASSERT_EQUALS("", errout.str());
check("char*** f(char*** c) {\n"
" ***c++;\n"
" return c;\n"
"}");
ASSERT_EQUALS("[test.cpp:2]: (warning) Ineffective statement similar to '*A++;'. Did you intend to write '(*A)++;'?\n", errout.str());
check("char** f(char*** c) {\n"
" **c[5]--;\n"
" return **c;\n"
"}");
ASSERT_EQUALS("[test.cpp:2]: (warning) Ineffective statement similar to '*A++;'. Did you intend to write '(*A)++;'?\n", errout.str());
check("char*** f(char*** c) {\n"
" (***c)++;\n"
" return c;\n"
"}");
ASSERT_EQUALS("", errout.str());
check("void *f(char** c) {\n"
" bar(**c++);\n"
"}");
ASSERT_EQUALS("", errout.str());
}
// clarify conditions with = and comparison