CheckClass: Refactoring

This commit is contained in:
Daniel Marjamäki 2021-02-03 19:25:28 +01:00
parent b07b464c80
commit 0338e99f84
2 changed files with 9 additions and 7 deletions

View File

@ -534,18 +534,17 @@ bool CheckClass::canNotMove(const Scope *scope)
return constructor && !(publicAssign || publicCopy || publicMove); return constructor && !(publicAssign || publicCopy || publicMove);
} }
static void getAllVariableMembers(const Scope *scope, std::vector<const Variable *>& varList, std::vector<const Scope *> &baseClasses) static void getAllVariableMembers(const Scope *scope, std::vector<const Variable *>& varList)
{ {
if (std::find(baseClasses.begin(), baseClasses.end(), scope) != baseClasses.end())
return;
baseClasses.push_back(scope);
for (const Variable& var: scope->varlist) for (const Variable& var: scope->varlist)
varList.push_back(&var); varList.push_back(&var);
if (scope->definedType) { if (scope->definedType) {
for (const Type::BaseInfo& baseInfo: scope->definedType->derivedFrom) { for (const Type::BaseInfo& baseInfo: scope->definedType->derivedFrom) {
if (scope->definedType == baseInfo.type)
continue;
const Scope *baseClass = baseInfo.type ? baseInfo.type->classScope : nullptr; const Scope *baseClass = baseInfo.type ? baseInfo.type->classScope : nullptr;
if (baseClass && baseClass->isClassOrStruct() && baseClass->numConstructors == 0) if (baseClass && baseClass->isClassOrStruct() && baseClass->numConstructors == 0)
getAllVariableMembers(baseClass, varList, baseClasses); getAllVariableMembers(baseClass, varList);
} }
} }
} }
@ -554,8 +553,7 @@ std::vector<CheckClass::Usage> CheckClass::createUsageList(const Scope *scope)
{ {
std::vector<Usage> ret; std::vector<Usage> ret;
std::vector<const Variable *> varlist; std::vector<const Variable *> varlist;
std::vector<const Scope *> temp; getAllVariableMembers(scope, varlist);
getAllVariableMembers(scope, varlist, temp);
for (const Variable *var: varlist) for (const Variable *var: varlist)
ret.emplace_back(var); ret.emplace_back(var);
return ret; return ret;

View File

@ -571,6 +571,10 @@ private:
"};"); "};");
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:10]: (warning) The class 'Derived2' defines member variable with name 'i' also defined in its parent class 'Base'.\n", errout.str()); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:10]: (warning) The class 'Derived2' defines member variable with name 'i' also defined in its parent class 'Base'.\n", errout.str());
// don't crash on recursive template
checkDuplInheritedMembers("template<size_t N>\n"
"struct BitInt : public BitInt<N+1> { };");
ASSERT_EQUALS("", errout.str());
} }
void checkCopyConstructor(const char code[]) { void checkCopyConstructor(const char code[]) {