From e31b2f8b73ff08f065735616ffcf506d49476b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 14 Feb 2020 09:40:27 +0100 Subject: [PATCH] SymbolDatabase; Set smart pointer type in Variable valueType --- lib/symboldatabase.cpp | 16 +++++++++++++++- lib/symboldatabase.h | 1 + test/testsymboldatabase.cpp | 12 ++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 9031044df..14f825ae1 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -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) diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index ea316c6d0..485e8af5d 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -1337,6 +1337,7 @@ private: void createSymbolDatabaseSetFunctionPointers(bool firstPass); void createSymbolDatabaseSetVariablePointers(); void createSymbolDatabaseSetTypePointers(); + void createSymbolDatabaseSetSmartPointerType(); void createSymbolDatabaseEnums(); void createSymbolDatabaseEscapeFunctions(); void createSymbolDatabaseIncompleteVars(); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index e957b9214..36cb69b41 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -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 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"