diff options
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 14 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInherit.cpp | 16 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInherit.h | 8 |
3 files changed, 24 insertions, 14 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 562b2dab055..550a1441ac9 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -2145,23 +2145,11 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, // Look for virtual methods in base classes that this method might override. BasePaths Paths; - // FIXME: This will not include hidden member functions. if (LookupInBases(cast<CXXRecordDecl>(DC), - MemberLookupCriteria(Name, LookupMemberName, - // FIXME: Shouldn't IDNS_Member be - // enough here? - Decl::IDNS_Member | - Decl::IDNS_Ordinary), Paths)) { + MemberLookupCriteria(NewMD), Paths)) { for (BasePaths::decl_iterator I = Paths.found_decls_begin(), E = Paths.found_decls_end(); I != E; ++I) { if (CXXMethodDecl *OldMD = dyn_cast<CXXMethodDecl>(*I)) { - OverloadedFunctionDecl::function_iterator MatchedDecl; - // FIXME: Is this OK? Should it be done by LookupInBases? - if (IsOverload(NewMD, OldMD, MatchedDecl)) - continue; - if (!OldMD->isVirtual()) - continue; - if (!CheckOverridingFunctionReturnType(NewMD, OldMD)) NewMD->addOverriddenMethod(OldMD); } diff --git a/clang/lib/Sema/SemaInherit.cpp b/clang/lib/Sema/SemaInherit.cpp index 5eef1eb4c07..1eccc1f193f 100644 --- a/clang/lib/Sema/SemaInherit.cpp +++ b/clang/lib/Sema/SemaInherit.cpp @@ -191,6 +191,22 @@ bool Sema::LookupInBases(CXXRecordDecl *Class, ++Paths.ScratchPath.Decls.first; } break; + case MemberLookupCriteria::LK_OverriddenMember: + Paths.ScratchPath.Decls = + BaseRecord->lookup(Context, Criteria.Method->getDeclName()); + while (Paths.ScratchPath.Decls.first != Paths.ScratchPath.Decls.second) { + CXXMethodDecl *MD = + cast<CXXMethodDecl>(*Paths.ScratchPath.Decls.first); + + OverloadedFunctionDecl::function_iterator MatchedDecl; + if (MD->isVirtual() && !IsOverload(Criteria.Method, MD, MatchedDecl)) { + FoundPathToThisBase = true; + break; + } + + ++Paths.ScratchPath.Decls.first; + } + break; } if (FoundPathToThisBase) { diff --git a/clang/lib/Sema/SemaInherit.h b/clang/lib/Sema/SemaInherit.h index 33199636912..b1e791a17ba 100644 --- a/clang/lib/Sema/SemaInherit.h +++ b/clang/lib/Sema/SemaInherit.h @@ -205,7 +205,8 @@ namespace clang { /// LookupKind - the kind of lookup we're doing. enum LookupKind { LK_Base, - LK_NamedMember + LK_NamedMember, + LK_OverriddenMember }; /// MemberLookupCriteria - Constructs member lookup criteria to @@ -220,6 +221,9 @@ namespace clang { unsigned IDNS) : Kind(LK_NamedMember), Name(Name), NameKind(NameKind), IDNS(IDNS) { } + explicit MemberLookupCriteria(CXXMethodDecl *MD) + : Kind(LK_OverriddenMember), Method(MD) { } + /// Kind - The kind of lookup we're doing. /// LK_Base if we are looking for a base class (whose /// type is Base). LK_NamedMember if we are looking for a named member of @@ -236,6 +240,8 @@ namespace clang { Sema::LookupNameKind NameKind; unsigned IDNS; + + CXXMethodDecl *Method; }; } |