diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index a5af89bfb46..47034019920 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -633,7 +633,7 @@ const ::Type * clangimport::AstNode::addTypeTokens(TokenList &tokenList, const s for (const Token *typeToken = tokenList.back(); Token::Match(typeToken, "&|*|%name%"); typeToken = typeToken->previous()) { if (!typeToken->isName()) continue; - const ::Type *recordType = scope->check->findVariableType(scope, typeToken); + const ::Type *recordType = scope->symdb.findVariableType(scope, typeToken); if (recordType) { const_cast(typeToken)->type(recordType); return recordType; @@ -702,14 +702,13 @@ Scope *clangimport::AstNode::createScope(TokenList &tokenList, ScopeType scopeTy auto *nestedIn = const_cast(getNestedInScope(tokenList)); - symbolDatabase.scopeList.emplace_back(nullptr, nullptr, nestedIn); + symbolDatabase.scopeList.emplace_back(nestedIn->symdb, nullptr, nestedIn); Scope *scope = &symbolDatabase.scopeList.back(); if (scopeType == ScopeType::eEnum) scope->enumeratorList.reserve(children2.size()); nestedIn->nestedList.push_back(scope); scope->type = scopeType; - scope->classDef = def; - scope->check = nestedIn->check; + scope->classDef = def; // TODO: pass into ctor if (Token::Match(def, "if|for|while (")) { std::map replaceVar; for (const Token *vartok = def->tokAt(2); vartok; vartok = vartok->next()) { @@ -1404,11 +1403,10 @@ void clangimport::AstNode::createTokensFunctionDecl(TokenList &tokenList) Scope *scope = nullptr; if (hasBody) { - symbolDatabase.scopeList.emplace_back(nullptr, nullptr, nestedIn); + symbolDatabase.scopeList.emplace_back(symbolDatabase, nullptr, nestedIn); scope = &symbolDatabase.scopeList.back(); - scope->check = &symbolDatabase; scope->function = function; - scope->classDef = nameToken; + scope->classDef = nameToken; // TODO: pass into ctor scope->type = ScopeType::eFunction; scope->className = nameToken->str(); nestedIn->nestedList.push_back(scope); @@ -1620,9 +1618,8 @@ void clangimport::parseClangAstDump(Tokenizer &tokenizer, std::istream &f) tokenizer.createSymbolDatabase(); auto *symbolDatabase = const_cast(tokenizer.getSymbolDatabase()); - symbolDatabase->scopeList.emplace_back(nullptr, nullptr, nullptr); + symbolDatabase->scopeList.emplace_back(*symbolDatabase, nullptr, nullptr); symbolDatabase->scopeList.back().type = ScopeType::eGlobal; - symbolDatabase->scopeList.back().check = symbolDatabase; clangimport::Data data(tokenizer.getSettings(), *symbolDatabase); std::string line; diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 56e984f0f96..9ec965e3f46 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -53,8 +53,10 @@ #include //--------------------------------------------------------------------------- -SymbolDatabase::SymbolDatabase(Tokenizer& tokenizer, const Settings& settings, ErrorLogger& errorLogger) - : mTokenizer(tokenizer), mSettings(settings), mErrorLogger(errorLogger) +SymbolDatabase::SymbolDatabase(Tokenizer& tokenizer) + : mTokenizer(tokenizer) + , mSettings(tokenizer.getSettings()) + , mErrorLogger(tokenizer.getErrorLogger()) { if (!mTokenizer.tokens()) return; @@ -141,7 +143,7 @@ const Token* SymbolDatabase::isEnumDefinition(const Token* tok) void SymbolDatabase::createSymbolDatabaseFindAllScopes() { // create global scope - scopeList.emplace_back(this, nullptr, nullptr); + scopeList.emplace_back(*this, nullptr, nullptr); // pointer to current scope Scope *scope = &scopeList.back(); @@ -289,7 +291,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() scope = new_scope; tok = tok2; } else { - scopeList.emplace_back(this, tok, scope); + scopeList.emplace_back(*this, tok, scope); new_scope = &scopeList.back(); if (tok->str() == "class") @@ -354,7 +356,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() Token::Match(tok, "namespace %name% %type% (") && tok->tokAt(2)->isUpperCaseName() && Token::simpleMatch(tok->linkAt(3), ") {")) { - scopeList.emplace_back(this, tok, scope); + scopeList.emplace_back(*this, tok, scope); Scope *new_scope = &scopeList.back(); access[new_scope] = AccessControl::Public; @@ -430,7 +432,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() // unnamed struct and union else if (tok->isKeyword() && Token::Match(tok, "struct|union {") && Token::Match(tok->linkAt(1), "} *|&| %name% ;|[|=")) { - scopeList.emplace_back(this, tok, scope); + scopeList.emplace_back(*this, tok, scope); Scope *new_scope = &scopeList.back(); access[new_scope] = AccessControl::Public; @@ -449,7 +451,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() scope->definedTypesMap[new_type->name()] = new_type; } - scope->addVariable(varNameTok, tok, tok, access[scope], new_scope->definedType, scope, mSettings); + scope->addVariable(varNameTok, tok, tok, access[scope], new_scope->definedType, scope); const Token *tok2 = tok->next(); @@ -472,7 +474,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() else if (tok->isKeyword() && ((Token::Match(tok, "struct|union {") && Token::simpleMatch(tok->linkAt(1), "} ;")) || Token::simpleMatch(tok, "namespace {"))) { - scopeList.emplace_back(this, tok, scope); + scopeList.emplace_back(*this, tok, scope); Scope *new_scope = &scopeList.back(); access[new_scope] = AccessControl::Public; @@ -710,11 +712,11 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() if (tok->isKeyword() && Token::Match(tok, "else|try|do {")) { const Token* tok1 = tok->next(); if (tok->str() == "else") - scopeList.emplace_back(this, tok, scope, ScopeType::eElse, tok1); + scopeList.emplace_back(*this, tok, scope, ScopeType::eElse, tok1); else if (tok->str() == "do") - scopeList.emplace_back(this, tok, scope, ScopeType::eDo, tok1); + scopeList.emplace_back(*this, tok, scope, ScopeType::eDo, tok1); else //if (tok->str() == "try") - scopeList.emplace_back(this, tok, scope, ScopeType::eTry, tok1); + scopeList.emplace_back(*this, tok, scope, ScopeType::eTry, tok1); tok = tok1; scope->nestedList.push_back(&scopeList.back()); @@ -722,22 +724,22 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() } else if (tok->isKeyword() && Token::Match(tok, "if|for|while|catch|switch (") && Token::simpleMatch(tok->linkAt(1), ") {")) { const Token *scopeStartTok = tok->linkAt(1)->next(); if (tok->str() == "if") - scopeList.emplace_back(this, tok, scope, ScopeType::eIf, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, ScopeType::eIf, scopeStartTok); else if (tok->str() == "for") { - scopeList.emplace_back(this, tok, scope, ScopeType::eFor, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, ScopeType::eFor, scopeStartTok); } else if (tok->str() == "while") - scopeList.emplace_back(this, tok, scope, ScopeType::eWhile, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, ScopeType::eWhile, scopeStartTok); else if (tok->str() == "catch") { - scopeList.emplace_back(this, tok, scope, ScopeType::eCatch, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, ScopeType::eCatch, scopeStartTok); } else // if (tok->str() == "switch") - scopeList.emplace_back(this, tok, scope, ScopeType::eSwitch, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, ScopeType::eSwitch, scopeStartTok); scope->nestedList.push_back(&scopeList.back()); scope = &scopeList.back(); if (scope->type == ScopeType::eFor) - scope->checkVariable(tok->tokAt(2), AccessControl::Local, mSettings); // check for variable declaration and add it to new scope if found + scope->checkVariable(tok->tokAt(2), AccessControl::Local); // check for variable declaration and add it to new scope if found else if (scope->type == ScopeType::eCatch) - scope->checkVariable(tok->tokAt(2), AccessControl::Throw, mSettings); // check for variable declaration and add it to new scope if found + scope->checkVariable(tok->tokAt(2), AccessControl::Throw); // check for variable declaration and add it to new scope if found tok = tok->next(); inIfCondition.push(scopeStartTok); } else if (Token::Match(tok, "%var% {")) { @@ -751,7 +753,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() } else if (!inIfCondition.empty() && tok == inIfCondition.top()) { inIfCondition.pop(); } else if (isExecutableScope(tok)) { - scopeList.emplace_back(this, tok, scope, ScopeType::eUnconditional, tok); + scopeList.emplace_back(*this, tok, scope, ScopeType::eUnconditional, tok); scope->nestedList.push_back(&scopeList.back()); scope = &scopeList.back(); } else { @@ -849,14 +851,14 @@ void SymbolDatabase::createSymbolDatabaseVariableInfo() // fill in variable info for (Scope& scope : scopeList) { // find variables - scope.getVariableList(mSettings); + scope.getVariableList(); } // fill in function arguments for (Scope& scope : scopeList) { for (auto func = scope.functionList.begin(); func != scope.functionList.end(); ++func) { // add arguments - func->addArguments(this, &scope); + func->addArguments(&scope); } } } @@ -2794,10 +2796,10 @@ static bool typesMatch( const Token *&new_second) { // get first type - const Type* first_type = first_scope->check->findType(first_token, first_scope, /*lookOutside*/ true); + const Type* first_type = first_scope->symdb.findType(first_token, first_scope, /*lookOutside*/ true); if (first_type) { // get second type - const Type* second_type = second_scope->check->findType(second_token, second_scope, /*lookOutside*/ true); + const Type* second_type = second_scope->symdb.findType(second_token, second_scope, /*lookOutside*/ true); // check if types match if (first_type == second_type) { const Token* tok1 = first_token; @@ -3447,7 +3449,7 @@ void SymbolDatabase::addClassFunction(Scope *&scope, const Token *&tok, const To void SymbolDatabase::addNewFunction(Scope *&scope, const Token *&tok) { const Token *tok1 = tok; - scopeList.emplace_back(this, tok1, scope); + scopeList.emplace_back(*this, tok1, scope); Scope *newScope = &scopeList.back(); // find start of function '{' @@ -3575,7 +3577,7 @@ const Token *Type::initBaseInfo(const Token *tok, const Token *tok1) } } - const Type * baseType = classScope->check->findType(base.nameTok, enclosingScope); + const Type * baseType = classScope->symdb.findType(base.nameTok, enclosingScope); if (baseType && !baseType->findDependency(this)) base.type = baseType; @@ -4431,9 +4433,9 @@ void SymbolDatabase::printXml(std::ostream &out) const //--------------------------------------------------------------------------- -static const Type* findVariableTypeIncludingUsedNamespaces(const SymbolDatabase* symbolDatabase, const Scope* scope, const Token* typeTok) +static const Type* findVariableTypeIncludingUsedNamespaces(const Scope* scope, const Token* typeTok) { - const Type* argType = symbolDatabase->findVariableType(scope, typeTok); + const Type* argType = scope->symdb.findVariableType(scope, typeTok); if (argType) return argType; @@ -4441,7 +4443,7 @@ static const Type* findVariableTypeIncludingUsedNamespaces(const SymbolDatabase* while (scope) { for (const Scope::UsingInfo &ui : scope->usingList) { if (ui.scope) { - argType = symbolDatabase->findVariableType(ui.scope, typeTok); + argType = scope->symdb.findVariableType(ui.scope, typeTok); if (argType) return argType; } @@ -4453,7 +4455,7 @@ static const Type* findVariableTypeIncludingUsedNamespaces(const SymbolDatabase* //--------------------------------------------------------------------------- -void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *scope) +void Function::addArguments(const Scope *scope) { // check for non-empty argument list "( ... )" const Token * start = arg ? arg : argDef; @@ -4514,7 +4516,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s while (Token::Match(typeTok, "const|volatile|enum|struct|::")) typeTok = typeTok->next(); if (Token::Match(typeTok, ",|)")) { // #8333 - symbolDatabase->mTokenizer.syntaxError(typeTok); + scope->symdb.mTokenizer.syntaxError(typeTok); } if (Token::Match(typeTok, "%type% <") && Token::Match(typeTok->linkAt(1), "> :: %type%")) typeTok = typeTok->linkAt(1)->tokAt(2); @@ -4533,7 +4535,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s endTok = nameTok->previous(); if (hasBody()) - symbolDatabase->debugMessage(nameTok, "varid0", "Function::addArguments found argument \'" + nameTok->str() + "\' with varid 0."); + scope->symdb.debugMessage(nameTok, "varid0", "Function::addArguments found argument \'" + nameTok->str() + "\' with varid 0."); } else endTok = typeTok; } else @@ -4542,7 +4544,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s const ::Type *argType = nullptr; if (!typeTok->isStandardType()) { - argType = findVariableTypeIncludingUsedNamespaces(symbolDatabase, scope, typeTok); + argType = findVariableTypeIncludingUsedNamespaces(scope, typeTok); // save type const_cast(typeTok)->type(argType); @@ -4564,7 +4566,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s if (startTok == nameTok) break; - argumentList.emplace_back(nameTok, startTok, endTok, count++, AccessControl::Argument, argType, functionScope, symbolDatabase->mSettings); + argumentList.emplace_back(nameTok, startTok, endTok, count++, AccessControl::Argument, argType, functionScope, scope->symdb.mSettings); if (tok->str() == ")") { // check for a variadic function or a variadic template function @@ -4737,8 +4739,8 @@ const Variable* Function::getArgumentVar(nonneg int num) const //--------------------------------------------------------------------------- -Scope::Scope(const SymbolDatabase *check_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_) : - check(check_), +Scope::Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_) : + symdb(symdb_), classDef(classDef_), nestedIn(nestedIn_), type(type_) @@ -4746,8 +4748,8 @@ Scope::Scope(const SymbolDatabase *check_, const Token *classDef_, const Scope * setBodyStartEnd(start_); } -Scope::Scope(const SymbolDatabase *check_, const Token *classDef_, const Scope *nestedIn_) : - check(check_), +Scope::Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_) : + symdb(symdb_), classDef(classDef_), nestedIn(nestedIn_) { @@ -4803,36 +4805,36 @@ AccessControl Scope::defaultAccess() const } void Scope::addVariable(const Token *token_, const Token *start_, const Token *end_, - AccessControl access_, const Type *type_, const Scope *scope_, const Settings& settings) + AccessControl access_, const Type *type_, const Scope *scope_) { // keep possible size_t -> int truncation outside emplace_back() to have a single line // C4267 VC++ warning instead of several dozens lines const int varIndex = varlist.size(); - varlist.emplace_back(token_, start_, end_, varIndex, access_, type_, scope_, settings); + varlist.emplace_back(token_, start_, end_, varIndex, access_, type_, scope_, scope_->symdb.mSettings); } // Get variable list.. -void Scope::getVariableList(const Settings& settings) +void Scope::getVariableList() { if (!bodyStartList.empty()) { for (const Token *bs: bodyStartList) - getVariableList(settings, bs->next(), bs->link()); + getVariableList(bs->next(), bs->link()); } // global scope else if (type == ScopeType::eGlobal) - getVariableList(settings, check->mTokenizer.tokens(), nullptr); + getVariableList(symdb.mTokenizer.tokens(), nullptr); // forward declaration else return; } -void Scope::getVariableList(const Settings& settings, const Token* start, const Token* end) +void Scope::getVariableList(const Token* start, const Token* end) { // Variable declared in condition: if (auto x = bar()) if (Token::Match(classDef, "if|while ( %type%") && Token::simpleMatch(classDef->next()->astOperand2(), "=")) { - checkVariable(classDef->tokAt(2), defaultAccess(), settings); + checkVariable(classDef->tokAt(2), defaultAccess()); } AccessControl varaccess = defaultAccess(); @@ -4929,14 +4931,14 @@ void Scope::getVariableList(const Settings& settings, const Token* start, const if (tok->str() == ";") continue; - tok = checkVariable(tok, varaccess, settings); + tok = checkVariable(tok, varaccess); if (!tok) break; } } -const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess, const Settings& settings) +const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess) { // Is it a throw..? if (tok->isKeyword() && Token::Match(tok, "throw %any% (") && @@ -4966,11 +4968,11 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess, con const Token *typestart = tok; // C++17 structured bindings - if (tok && tok->isCpp() && (settings.standards.cpp >= Standards::CPP17) && Token::Match(tok, "auto &|&&| [")) { + if (tok && tok->isCpp() && (symdb.mSettings.standards.cpp >= Standards::CPP17) && Token::Match(tok, "auto &|&&| [")) { const Token *typeend = Token::findsimplematch(typestart, "[")->previous(); for (tok = typeend->tokAt(2); Token::Match(tok, "%name%|,"); tok = tok->next()) { if (tok->varId()) - addVariable(tok, typestart, typeend, varaccess, nullptr, this, settings); + addVariable(tok, typestart, typeend, varaccess, nullptr, this); } return typeend->linkAt(1); } @@ -4992,14 +4994,14 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess, con if (vartok->varId() == 0) { if (!vartok->isBoolean()) - check->debugMessage(vartok, "varid0", "Scope::checkVariable found variable \'" + vartok->str() + "\' with varid 0."); + symdb.debugMessage(vartok, "varid0", "Scope::checkVariable found variable \'" + vartok->str() + "\' with varid 0."); return tok; } const Type *vType = nullptr; if (typetok) { - vType = findVariableTypeIncludingUsedNamespaces(check, this, typetok); + vType = findVariableTypeIncludingUsedNamespaces(this, typetok); const_cast(typetok)->type(vType); } @@ -5008,7 +5010,7 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess, con if (Token::Match(typestart, "enum|struct")) typestart = typestart->next(); - addVariable(vartok, typestart, vartok->previous(), varaccess, vType, this, settings); + addVariable(vartok, typestart, vartok->previous(), varaccess, vType, this); if (type == ScopeType::eFor && orig->strAt(-2) == "for") { for (const Token* tok2 = tok; tok2 && !Token::Match(tok2, "[;:]"); tok2 = tok2->next()) { @@ -5018,10 +5020,10 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess, con } if (Token::Match(tok2, ", %name%")) { if (tok2->next()->varId() == 0) { - check->debugMessage(tok2->next(), "varid0", "Scope::checkVariable found variable \'" + tok2->strAt(1) + "\' with varid 0."); + symdb.debugMessage(tok2->next(), "varid0", "Scope::checkVariable found variable \'" + tok2->strAt(1) + "\' with varid 0."); return tok; } - addVariable(tok2->next(), typestart, vartok->previous(), varaccess, vType, this, settings); + addVariable(tok2->next(), typestart, vartok->previous(), varaccess, vType, this); } } } @@ -5088,7 +5090,7 @@ bool Scope::isVariableDeclaration(const Token* const tok, const Token*& vartok, if (isCPP && Token::Match(tok, "throw|new")) return false; - const bool isCPP11 = isCPP && check->mSettings.standards.cpp >= Standards::CPP11; + const bool isCPP11 = isCPP && symdb.mSettings.standards.cpp >= Standards::CPP11; if (isCPP11 && tok->str() == "using") return false; @@ -7314,7 +7316,7 @@ static const Token* parsedecl(const Token* type, valuetype->container = container; } else { const Scope *scope = type->scope(); - valuetype->typeScope = scope->check->findScope(typeTokens.front(), scope); + valuetype->typeScope = scope->symdb.findScope(typeTokens.front(), scope); if (valuetype->typeScope) valuetype->type = (scope->type == ScopeType::eClass) ? ValueType::Type::RECORD : ValueType::Type::NONSTD; } diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index 7ffc1f19d65..6d16fddbe84 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -41,7 +41,6 @@ #include class Platform; -class ErrorLogger; class Function; class Scope; class Settings; @@ -777,7 +776,7 @@ class CPPCHECKLIB Function { nonneg int initializedArgCount() const { return initArgCount; } - void addArguments(const SymbolDatabase *symbolDatabase, const Scope *scope); + void addArguments(const Scope *scope); /** @brief check if this function is virtual in the base classes */ bool isImplicitlyVirtual(bool defaultVal = false, bool* pFoundAllBaseClasses = nullptr) const; @@ -1038,10 +1037,10 @@ class CPPCHECKLIB Scope { const Scope *scope; }; - Scope(const SymbolDatabase *check_, const Token *classDef_, const Scope *nestedIn_); - Scope(const SymbolDatabase *check_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_); + Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_); + Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_); - const SymbolDatabase* check{}; + const SymbolDatabase& symdb; std::string className; const Token* classDef{}; ///< class/struct/union/namespace token const Token* bodyStart{}; ///< '{' token @@ -1158,10 +1157,10 @@ class CPPCHECKLIB Scope { void addVariable(const Token *token_, const Token *start_, const Token *end_, AccessControl access_, const Type *type_, - const Scope *scope_, const Settings& settings); + const Scope *scope_); /** @brief initialize varlist */ - void getVariableList(const Settings& settings); + void getVariableList(); const Function *getDestructor() const; @@ -1179,10 +1178,9 @@ class CPPCHECKLIB Scope { * @brief check if statement is variable declaration and add it if it is * @param tok pointer to start of statement * @param varaccess access control of statement - * @param settings Settings * @return pointer to last token */ - const Token *checkVariable(const Token *tok, AccessControl varaccess, const Settings& settings); + const Token *checkVariable(const Token *tok, AccessControl varaccess); /** * @brief get variable from name @@ -1210,7 +1208,7 @@ class CPPCHECKLIB Scope { void findFunctionInBase(const std::string & name, nonneg int args, std::vector & matches) const; /** @brief initialize varlist */ - void getVariableList(const Settings& settings, const Token *start, const Token *end); + void getVariableList(const Token *start, const Token *end); }; /** Value type */ @@ -1328,7 +1326,7 @@ class CPPCHECKLIB ValueType { class CPPCHECKLIB SymbolDatabase { friend class TestSymbolDatabase; public: - SymbolDatabase(Tokenizer& tokenizer, const Settings& settings, ErrorLogger& errorLogger); + explicit SymbolDatabase(Tokenizer& tokenizer); ~SymbolDatabase(); /** @brief Information about all namespaces/classes/structures */ diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index f719329039c..d5ed6ee6831 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -10291,7 +10291,7 @@ void Tokenizer::simplifyBorland() void Tokenizer::createSymbolDatabase() { if (!mSymbolDatabase) - mSymbolDatabase = new SymbolDatabase(*this, mSettings, mErrorLogger); + mSymbolDatabase = new SymbolDatabase(*this); mSymbolDatabase->validate(); } diff --git a/lib/tokenize.h b/lib/tokenize.h index 150ad6d6fb6..bf6b3e8965b 100644 --- a/lib/tokenize.h +++ b/lib/tokenize.h @@ -607,6 +607,10 @@ class CPPCHECKLIB Tokenizer { return mSettings; } + ErrorLogger &getErrorLogger() { + return mErrorLogger; + } + void calculateScopes(); /** Disable copy constructor */