From 205af353db3b1591427c4eaeeafbf2cdee8745dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 3 Feb 2021 19:13:49 +0100 Subject: [PATCH] CheckClass: Fix endless recursion --- lib/checkclass.cpp | 23 ++++++++++++++++++----- lib/checkclass.h | 3 +-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 0a1d0864d..c324c7552 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -137,8 +137,7 @@ void CheckClass::constructors() } - std::vector usageList; - createUsageList(usageList, scope); + std::vector usageList = createUsageList(scope); for (const Function &func : scope->functionList) { if (!func.hasBody() || !(func.isConstructor() || func.type == Function::eOperatorEqual)) @@ -535,19 +534,33 @@ bool CheckClass::canNotMove(const Scope *scope) return constructor && !(publicAssign || publicCopy || publicMove); } -void CheckClass::createUsageList(std::vector& usageList, const Scope *scope) +static void getAllVariableMembers(const Scope *scope, std::vector& varList, std::vector &baseClasses) { + if (std::find(baseClasses.begin(), baseClasses.end(), scope) != baseClasses.end()) + return; + baseClasses.push_back(scope); for (const Variable& var: scope->varlist) - usageList.push_back(Usage(&var)); + varList.push_back(&var); if (scope->definedType) { for (const Type::BaseInfo& baseInfo: scope->definedType->derivedFrom) { const Scope *baseClass = baseInfo.type ? baseInfo.type->classScope : nullptr; if (baseClass && baseClass->isClassOrStruct() && baseClass->numConstructors == 0) - createUsageList(usageList, baseClass); + getAllVariableMembers(baseClass, varList, baseClasses); } } } +std::vector CheckClass::createUsageList(const Scope *scope) +{ + std::vector ret; + std::vector varlist; + std::vector temp; + getAllVariableMembers(scope, varlist, temp); + for (const Variable *var: varlist) + ret.emplace_back(var); + return ret; +} + void CheckClass::assignVar(std::vector &usageList, nonneg int varid) { for (Usage& usage: usageList) { diff --git a/lib/checkclass.h b/lib/checkclass.h index 5408af6f5..b3053b0f5 100644 --- a/lib/checkclass.h +++ b/lib/checkclass.h @@ -296,10 +296,9 @@ private: /** * @brief Create usage list that contains all scope members and also members * of base classes without constructors. - * @param usageList usageList that will be filled up * @param scope current class scope */ - static void createUsageList(std::vector& usageList, const Scope *scope); + static std::vector createUsageList(const Scope *scope); /** * @brief assign a variable in the varlist