Fixed #3939: Support ****foo++;
This commit is contained in:
parent
c3a65dca40
commit
b156c727b0
|
@ -238,21 +238,29 @@ void CheckOther::clarifyStatement()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) {
|
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) {
|
||||||
if (Token::Match(tok, "[{};] * %var%")) {
|
if (Token::Match(tok, "* %var%")) {
|
||||||
tok = tok->tokAt(3);
|
const Token *tok2=tok->previous();
|
||||||
while (tok) {
|
|
||||||
if (tok->str() == "[")
|
while (Token::Match(tok2, "*"))
|
||||||
tok = tok->link()->next();
|
tok2=tok2->previous();
|
||||||
if (Token::Match(tok, ".|:: %var%")) {
|
|
||||||
if (tok->strAt(2) == "(")
|
if (Token::Match(tok2, "[{};]")) {
|
||||||
tok = tok->linkAt(2)->next();
|
tok = tok->tokAt(2);
|
||||||
else
|
while (tok) {
|
||||||
tok = tok->tokAt(2);
|
if (tok->str() == "[")
|
||||||
} else
|
tok = tok->link()->next();
|
||||||
break;
|
|
||||||
|
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4040,6 +4040,29 @@ private:
|
||||||
" bar(*c++);\n"
|
" bar(*c++);\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
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
|
// clarify conditions with = and comparison
|
||||||
|
|
Loading…
Reference in New Issue