diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-02-10 18:13:41 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-02-10 18:13:41 +0000 |
| commit | 7dd856a76b4e7cd1040da69b88501e1b94bbbe5f (patch) | |
| tree | 96d6f45bc8fb5d485a25fd8ff8d032a30d0d2add | |
| parent | 77224a54223bfcff18d83faa2971116126d99411 (diff) | |
| download | bcm5719-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.cpp | 5 | ||||
| -rw-r--r-- | clang/test/SemaCXX/warn-overloaded-virtual.cpp | 13 |
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); +}; +} |

