Fixed #9618 (isCast flag not set for c++ casts)

This commit is contained in:
Daniel Marjamäki 2020-02-16 16:46:30 +01:00
parent 921887a281
commit ae0a73a538
2 changed files with 26 additions and 0 deletions

View File

@ -4638,6 +4638,14 @@ bool Tokenizer::simplifyTokenList1(const char FileName[])
// Link < with > // Link < with >
createLinks2(); createLinks2();
// Mark C++ casts
for (Token *tok = list.front(); tok; tok = tok->next()) {
if (Token::Match(tok, "const_cast|dynamic_cast|reinterpret_cast|static_cast <") && Token::simpleMatch(tok->linkAt(1), "> (")) {
tok = tok->linkAt(1)->next();
tok->isCast(true);
}
}
// specify array size // specify array size
arraySize(); arraySize();

View File

@ -487,6 +487,8 @@ private:
TEST_CASE(unknownType); // #8952 TEST_CASE(unknownType); // #8952
TEST_CASE(unknownMacroBeforeReturn); TEST_CASE(unknownMacroBeforeReturn);
TEST_CASE(cppcast);
} }
std::string tokenizeAndStringify(const char code[], bool simplify = false, bool expand = true, Settings::PlatformType platform = Settings::Native, const char* filename = "test.cpp", bool cpp11 = true) { std::string tokenizeAndStringify(const char code[], bool simplify = false, bool expand = true, Settings::PlatformType platform = Settings::Native, const char* filename = "test.cpp", bool cpp11 = true) {
@ -8335,6 +8337,22 @@ private:
void unknownMacroBeforeReturn() { void unknownMacroBeforeReturn() {
ASSERT_THROW(tokenizeAndStringify("int f() { X return 0; }"), InternalError); ASSERT_THROW(tokenizeAndStringify("int f() { X return 0; }"), InternalError);
} }
void cppcast() {
const char code[] = "a = const_cast<int>(x);\n"
"a = dynamic_cast<int>(x);\n"
"a = reinterpret_cast<int>(x);\n"
"a = static_cast<int>(x);\n";
Settings settings;
Tokenizer tokenizer(&settings, this);
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp");
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) {
ASSERT_EQUALS(tok->str() == "(", tok->isCast());
}
}
}; };
REGISTER_TEST(TestTokenizer) REGISTER_TEST(TestTokenizer)