summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp14
-rw-r--r--clang/lib/Sema/SemaInherit.cpp16
-rw-r--r--clang/lib/Sema/SemaInherit.h8
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;
};
}
OpenPOWER on IntegriCloud