SymbolDatabase: Refactoring and testing isImplicitlyVirtual

This commit is contained in:
Daniel Marjamäki 2018-04-24 13:53:58 +02:00
parent b94d8fd686
commit 8310198cd5
2 changed files with 23 additions and 10 deletions

View File

@ -3196,17 +3196,16 @@ bool Function::isImplicitlyVirtual(bool defaultVal) const
{
if (isVirtual())
return true;
else if (access == Private || access == Public || access == Protected) {
bool safe = true;
bool hasVirt = isImplicitlyVirtual_rec(nestedIn->definedType, safe);
if (hasVirt)
return true;
else if (safe)
return false;
else
return defaultVal;
} else
if (!nestedIn->isClassOrStruct())
return false;
bool safe = true;
bool hasVirt = isImplicitlyVirtual_rec(nestedIn->definedType, safe);
if (hasVirt)
return true;
else if (safe)
return false;
else
return defaultVal;
}
bool Function::isImplicitlyVirtual_rec(const ::Type* baseType, bool& safe) const

View File

@ -212,6 +212,8 @@ private:
TEST_CASE(functionArgs12); // #7661
TEST_CASE(functionArgs13); // #7697
TEST_CASE(functionImplicitlyVirtual);
TEST_CASE(namespaces1);
TEST_CASE(namespaces2);
TEST_CASE(namespaces3); // #3854 - unknown macro
@ -2065,6 +2067,18 @@ private:
}
}
void functionImplicitlyVirtual() {
GET_SYMBOL_DB("class base { virtual void f(); };\n"
"class derived : base { void f(); };\n"
"void derived::f() {}");
ASSERT(db != nullptr);
if (!db)
return;
ASSERT_EQUALS(4, db->scopeList.size());
const Function *function = db->scopeList.back().function;
ASSERT_EQUALS(true, function && function->isImplicitlyVirtual(false));
}
void namespaces1() {
GET_SYMBOL_DB("namespace fred {\n"
" namespace barney {\n"