Fixed #5289 (Crash: Stack overflow in isImplicitlyVirtual_rec when checking SVN)
This commit is contained in:
parent
29c64cc34c
commit
77362fd671
|
@ -2023,7 +2023,7 @@ bool Function::isImplicitlyVirtual(bool defaultVal) const
|
||||||
bool Function::isImplicitlyVirtual_rec(const ::Type* baseType, bool& safe) const
|
bool Function::isImplicitlyVirtual_rec(const ::Type* baseType, bool& safe) const
|
||||||
{
|
{
|
||||||
// check each base class
|
// check each base class
|
||||||
for (unsigned int i = 0; i < baseType->derivedFrom.size(); ++i) {
|
for (std::size_t i = 0; i < baseType->derivedFrom.size(); ++i) {
|
||||||
// check if base class exists in database
|
// check if base class exists in database
|
||||||
if (baseType->derivedFrom[i].type && baseType->derivedFrom[i].type->classScope) {
|
if (baseType->derivedFrom[i].type && baseType->derivedFrom[i].type->classScope) {
|
||||||
const Scope *parent = baseType->derivedFrom[i].type->classScope;
|
const Scope *parent = baseType->derivedFrom[i].type->classScope;
|
||||||
|
@ -2055,9 +2055,11 @@ bool Function::isImplicitlyVirtual_rec(const ::Type* baseType, bool& safe) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!baseType->derivedFrom[i].type->derivedFrom.empty())
|
if (!baseType->derivedFrom[i].type->derivedFrom.empty()) {
|
||||||
if (isImplicitlyVirtual_rec(baseType->derivedFrom[i].type, safe))
|
// avoid endless recursion, see #5289 Crash: Stack overflow in isImplicitlyVirtual_rec when checking SVN
|
||||||
|
if ((baseType != baseType->derivedFrom[i].type) && isImplicitlyVirtual_rec(baseType->derivedFrom[i].type, safe))
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// unable to find base class so assume it has no virtual function
|
// unable to find base class so assume it has no virtual function
|
||||||
safe = false;
|
safe = false;
|
||||||
|
|
|
@ -1760,6 +1760,19 @@ private:
|
||||||
"};");
|
"};");
|
||||||
ASSERT(db && db->findScopeByName("Deri") && db->findScopeByName("Deri")->functionList.front().isImplicitlyVirtual(false)); // Default false, but we saw "virtual" -> true
|
ASSERT(db && db->findScopeByName("Deri") && db->findScopeByName("Deri")->functionList.front().isImplicitlyVirtual(false)); // Default false, but we saw "virtual" -> true
|
||||||
}
|
}
|
||||||
|
// #5289
|
||||||
|
{
|
||||||
|
GET_SYMBOL_DB("template<>\n"
|
||||||
|
"class Bar<void, void> {\n"
|
||||||
|
"};\n"
|
||||||
|
"template<typename K, typename V, int KeySize>\n"
|
||||||
|
"class Bar : private Bar<void, void> {\n"
|
||||||
|
" void foo() {\n"
|
||||||
|
" }\n"
|
||||||
|
"};");
|
||||||
|
ASSERT(db && db->findScopeByName("Bar") && !db->findScopeByName("Bar")->functionList.front().isImplicitlyVirtual(false));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void garbage() {
|
void garbage() {
|
||||||
|
|
Loading…
Reference in New Issue