summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-02-10 18:13:41 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-02-10 18:13:41 +0000
commit7dd856a76b4e7cd1040da69b88501e1b94bbbe5f (patch)
tree96d6f45bc8fb5d485a25fd8ff8d032a30d0d2add
parent77224a54223bfcff18d83faa2971116126d99411 (diff)
downloadbcm5719-llvm-7dd856a76b4e7cd1040da69b88501e1b94bbbe5f.tar.gz
bcm5719-llvm-7dd856a76b4e7cd1040da69b88501e1b94bbbe5f.zip
For -Woverloaded-virtual take into account canonical methods. Fixes rdar://8979966 & http://llvm.org/PR9182.
llvm-svn: 125296
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp5
-rw-r--r--clang/test/SemaCXX/warn-overloaded-virtual.cpp13
2 files changed, 16 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 0f8f87143e5..90ec795005e 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -2827,6 +2827,7 @@ static bool FindHiddenVirtualMethod(const CXXBaseSpecifier *Specifier,
++Path.Decls.first) {
NamedDecl *D = *Path.Decls.first;
if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) {
+ MD = MD->getCanonicalDecl();
foundSameNameMethod = true;
// Interested only in hidden virtual methods.
if (!MD->isVirtual())
@@ -2871,10 +2872,10 @@ void Sema::DiagnoseHiddenVirtualMethods(CXXRecordDecl *DC, CXXMethodDecl *MD) {
for (CXXMethodDecl::method_iterator I = MD->begin_overridden_methods(),
E = MD->end_overridden_methods();
I != E; ++I)
- Data.OverridenAndUsingBaseMethods.insert(*I);
+ Data.OverridenAndUsingBaseMethods.insert((*I)->getCanonicalDecl());
if (UsingShadowDecl *shad = dyn_cast<UsingShadowDecl>(*res.first))
if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(shad->getTargetDecl()))
- Data.OverridenAndUsingBaseMethods.insert(MD);
+ Data.OverridenAndUsingBaseMethods.insert(MD->getCanonicalDecl());
}
if (DC->lookupInBases(&FindHiddenVirtualMethod, &Data, Paths) &&
diff --git a/clang/test/SemaCXX/warn-overloaded-virtual.cpp b/clang/test/SemaCXX/warn-overloaded-virtual.cpp
index 7636722e181..86b1d2365f9 100644
--- a/clang/test/SemaCXX/warn-overloaded-virtual.cpp
+++ b/clang/test/SemaCXX/warn-overloaded-virtual.cpp
@@ -39,3 +39,16 @@ struct S4 : public B4 {
void foo(float);
void foo();
};
+
+namespace PR9182 {
+struct Base {
+ virtual void foo(int);
+};
+
+void Base::foo(int) { }
+
+struct Derived : public Base {
+ virtual void foo(int);
+ void foo(int, int);
+};
+}
OpenPOWER on IntegriCloud