]> granicus.if.org Git - clang/commitdiff
For -Woverloaded-virtual take into account canonical methods. Fixes rdar://8979966...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 10 Feb 2011 18:13:41 +0000 (18:13 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 10 Feb 2011 18:13:41 +0000 (18:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125296 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/warn-overloaded-virtual.cpp

index 0f8f87143e59e3836151d4e6ce6f3b31cb3082b3..90ec795005ed7942b1ea3ad2fc4a9e089727956e 100644 (file)
@@ -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) &&
index 7636722e1811cb01c846db5e811071487389c2db..86b1d2365f93b0551de5b1e1fc9cd63b282f3f51 100644 (file)
@@ -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);   
+};
+}