SymbolDatabase; Set smart pointer type in Variable valueType
This commit is contained in:
parent
5f4a900f88
commit
e31b2f8b73
|
@ -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)
|
||||
|
|
|
@ -1337,6 +1337,7 @@ private:
|
|||
void createSymbolDatabaseSetFunctionPointers(bool firstPass);
|
||||
void createSymbolDatabaseSetVariablePointers();
|
||||
void createSymbolDatabaseSetTypePointers();
|
||||
void createSymbolDatabaseSetSmartPointerType();
|
||||
void createSymbolDatabaseEnums();
|
||||
void createSymbolDatabaseEscapeFunctions();
|
||||
void createSymbolDatabaseIncompleteVars();
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue