Fix FP missingOverride (#4894)

This commit is contained in:
chrchr-github 2023-03-18 16:39:45 +01:00 committed by GitHub
parent 716fcc5e96
commit 3b61ecd973
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 5 deletions

View File

@ -2647,10 +2647,10 @@ static bool typesMatch(
const Token **new_second)
{
// get first type
const Type * first_type = first_scope->check->findType(first_token, first_scope);
const Type* first_type = first_scope->check->findType(first_token, first_scope, /*lookOutside*/ true);
if (first_type) {
// get second type
const Type * second_type = second_scope->check->findType(second_token, second_scope);
const Type* second_type = second_scope->check->findType(second_token, second_scope, /*lookOutside*/ true);
// check if types match
if (first_type == second_type) {
const Token* tok1 = first_token;
@ -5840,14 +5840,15 @@ const Type* SymbolDatabase::findType(const Token *startTok, const Scope *startSc
tok = startTok;
}
} else {
const Type * type = scope->findType(tok->str());
const Scope* scope1{};
const Type* type = scope->findType(tok->str());
if (type)
return type;
else if (const Scope *scope1 = scope->findRecordInBase(tok->str())) {
if (lookOutside && (scope1 = scope->findRecordInBase(tok->str()))) {
type = scope1->definedType;
if (type)
return type;
} else if (scope->type == Scope::ScopeType::eNamespace && lookOutside) {
} else if (lookOutside && scope->type == Scope::ScopeType::eNamespace) {
scope = scope->nestedIn;
continue;
} else

View File

@ -376,6 +376,7 @@ private:
TEST_CASE(createSymbolDatabaseFindAllScopes3);
TEST_CASE(createSymbolDatabaseFindAllScopes4);
TEST_CASE(createSymbolDatabaseFindAllScopes5);
TEST_CASE(createSymbolDatabaseFindAllScopes6);
TEST_CASE(enum1);
TEST_CASE(enum2);
@ -5284,6 +5285,47 @@ private:
TODO_ASSERT(var && var->variable());
}
void createSymbolDatabaseFindAllScopes6()
{
GET_SYMBOL_DB("class A {\n"
"public:\n"
" class Nested {\n"
" public:\n"
" virtual ~Nested() = default;\n"
" };\n"
"};\n"
"class B {\n"
"public:\n"
" class Nested {\n"
" public:\n"
" virtual ~Nested() = default;\n"
" };\n"
"};\n"
"class C : public A, public B {\n"
"public:\n"
" class Nested : public A::Nested, public B::Nested {};\n"
"};\n");
ASSERT(db);
ASSERT_EQUALS(6, db->typeList.size());
auto it = db->typeList.cbegin();
const Type& classA = *it++;
const Type& classNA = *it++;
const Type& classB = *it++;
const Type& classNB = *it++;
const Type& classC = *it++;
const Type& classNC = *it++;
ASSERT(classA.name() == "A" && classB.name() == "B" && classC.name() == "C");
ASSERT(classNA.name() == "Nested" && classNB.name() == "Nested" && classNC.name() == "Nested");
ASSERT(classA.derivedFrom.empty() && classB.derivedFrom.empty());
ASSERT_EQUALS(classC.derivedFrom.size(), 2U);
ASSERT_EQUALS(classC.derivedFrom[0].type, &classA);
ASSERT_EQUALS(classC.derivedFrom[1].type, &classB);
ASSERT(classNA.derivedFrom.empty() && classNB.derivedFrom.empty());
ASSERT_EQUALS(classNC.derivedFrom.size(), 2U);
ASSERT_EQUALS(classNC.derivedFrom[0].type, &classNA);
ASSERT_EQUALS(classNC.derivedFrom[1].type, &classNB);
}
void enum1() {
GET_SYMBOL_DB("enum BOOL { FALSE, TRUE }; enum BOOL b;");