SymbolDatabase; Set smart pointer type in Variable valueType

This commit is contained in:
Daniel Marjamäki 2020-02-14 09:40:27 +01:00
parent 5f4a900f88
commit e31b2f8b73
3 changed files with 28 additions and 1 deletions

View File

@ -65,6 +65,7 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
setValueTypeInTokenList(false);
createSymbolDatabaseSetFunctionPointers(true);
createSymbolDatabaseSetTypePointers();
createSymbolDatabaseSetSmartPointerType();
createSymbolDatabaseEnums();
createSymbolDatabaseEscapeFunctions();
createSymbolDatabaseIncompleteVars();
@ -1116,6 +1117,19 @@ void SymbolDatabase::createSymbolDatabaseSetTypePointers()
}
}
void SymbolDatabase::createSymbolDatabaseSetSmartPointerType()
{
for (Scope &scope: scopeList) {
for (Variable &var: scope.varlist) {
if (var.valueType() && var.valueType()->smartPointerTypeToken && !var.valueType()->smartPointerType) {
ValueType vt(*var.valueType());
vt.smartPointerType = vt.smartPointerTypeToken->type();
var.setValueType(vt);
}
}
}
}
void SymbolDatabase::fixVarId(VarIdMap & varIds, const Token * vartok, Token * membertok, const Variable * membervar)
{
VarIdMap::iterator varId = varIds.find(vartok->varId());
@ -5507,7 +5521,7 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V
{
const Token * const previousType = type;
const unsigned int pointer0 = valuetype->pointer;
while (Token::Match(type->previous(), "%name%"))
while (Token::Match(type->previous(), "%name%") && !endsWith(type->previous()->str(), ':'))
type = type->previous();
valuetype->sign = ValueType::Sign::UNKNOWN_SIGN;
if (!valuetype->typeScope && !valuetype->smartPointerType)

View File

@ -1337,6 +1337,7 @@ private:
void createSymbolDatabaseSetFunctionPointers(bool firstPass);
void createSymbolDatabaseSetVariablePointers();
void createSymbolDatabaseSetTypePointers();
void createSymbolDatabaseSetSmartPointerType();
void createSymbolDatabaseEnums();
void createSymbolDatabaseEscapeFunctions();
void createSymbolDatabaseIncompleteVars();

View File

@ -151,6 +151,7 @@ private:
TEST_CASE(VariableValueType1);
TEST_CASE(VariableValueType2);
TEST_CASE(VariableValueType3);
TEST_CASE(VariableValueType4); // smart pointer type
TEST_CASE(findVariableType1);
TEST_CASE(findVariableType2);
@ -917,6 +918,17 @@ private:
}
}
void VariableValueType4() {
GET_SYMBOL_DB("class C {\n"
"public:\n"
" std::shared_ptr<C> x;\n"
"};");
const Variable* const x = db->getVariableFromVarId(1);
ASSERT(x->valueType());
ASSERT(x->valueType()->smartPointerType);
}
void findVariableType1() {
GET_SYMBOL_DB("class A {\n"
"public:\n"