diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 07758790b..def9f1e7f 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4828,6 +4828,29 @@ void SymbolDatabase::setValueTypeInTokenList(Token *tokens, bool cpp, const Sett setValueType(tok, *tok->variable(), cpp, defsign, settings); } else if (tok->enumerator()) { setValueType(tok, *tok->enumerator(), cpp, defsign, settings); + } else if (cpp && tok->str() == "new") { + if (Token::Match(tok, "new %type% ;|[")) { + ValueType vt; + vt.pointer = 1; + const Token * const typeTok = tok->next(); + // TODO: Reuse code in parsedecl + if (typeTok->str() == "char") + vt.type = ValueType::Type::CHAR; + else if (typeTok->str() == "short") + vt.type = ValueType::Type::SHORT; + else if (typeTok->str() == "int") + vt.type = ValueType::Type::INT; + else if (typeTok->str() == "long") + vt.type = ValueType::Type::LONG; + if (typeTok->isUnsigned()) + vt.sign = ValueType::Sign::UNSIGNED; + else if (typeTok->isSigned()) + vt.sign = ValueType::Sign::SIGNED; + if (vt.sign == ValueType::Sign::UNKNOWN_SIGN && vt.isIntegral()) + vt.sign = (vt.type == ValueType::Type::CHAR) ? defsign : ValueType::Sign::SIGNED; + if (vt.type != ValueType::Type::UNKNOWN_TYPE) + setValueType(tok, vt, cpp, defsign, settings); + } } } } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 60aff604b..bf6a9a013 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -4242,6 +4242,7 @@ private: // auto variables ASSERT_EQUALS("signed int", typeOf("; auto x = 3;", "x")); ASSERT_EQUALS("signed int *", typeOf("; auto *p = (int *)0;", "p")); + ASSERT_EQUALS("signed int *", typeOf("; auto data = new int[100];", "data")); ASSERT_EQUALS("const signed short", typeOf("short values[10]; void f() { for (const auto *x : values); }", "x")); }