@@ -137,8 +137,7 @@ void CheckClass::constructors()
137137 }
138138
139139
140- std::vector<Usage> usageList;
141- createUsageList (usageList, scope);
140+ std::vector<Usage> usageList = createUsageList (scope);
142141
143142 for (const Function &func : scope->functionList ) {
144143 if (!func.hasBody () || !(func.isConstructor () || func.type == Function::eOperatorEqual))
@@ -535,19 +534,33 @@ bool CheckClass::canNotMove(const Scope *scope)
535534 return constructor && !(publicAssign || publicCopy || publicMove);
536535}
537536
538- void CheckClass::createUsageList ( std::vector<Usage >& usageList, const Scope *scope )
537+ static void getAllVariableMembers ( const Scope *scope, std::vector<const Variable * >& varList, std::vector< const Scope *> &baseClasses )
539538{
539+ if (std::find (baseClasses.begin (), baseClasses.end (), scope) != baseClasses.end ())
540+ return ;
541+ baseClasses.push_back (scope);
540542 for (const Variable& var: scope->varlist )
541- usageList .push_back (Usage ( &var) );
543+ varList .push_back (&var);
542544 if (scope->definedType ) {
543545 for (const Type::BaseInfo& baseInfo: scope->definedType ->derivedFrom ) {
544546 const Scope *baseClass = baseInfo.type ? baseInfo.type ->classScope : nullptr ;
545547 if (baseClass && baseClass->isClassOrStruct () && baseClass->numConstructors == 0 )
546- createUsageList (usageList, baseClass );
548+ getAllVariableMembers (baseClass, varList, baseClasses );
547549 }
548550 }
549551}
550552
553+ std::vector<CheckClass::Usage> CheckClass::createUsageList (const Scope *scope)
554+ {
555+ std::vector<Usage> ret;
556+ std::vector<const Variable *> varlist;
557+ std::vector<const Scope *> temp;
558+ getAllVariableMembers (scope, varlist, temp);
559+ for (const Variable *var: varlist)
560+ ret.emplace_back (var);
561+ return ret;
562+ }
563+
551564void CheckClass::assignVar (std::vector<Usage> &usageList, nonneg int varid)
552565{
553566 for (Usage& usage: usageList) {
0 commit comments