From 002f2b3eecf942f473791b87d948e6df155e61b8 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sun, 13 Sep 2009 21:01:57 +0000 Subject: [PATCH] CXXMethodDecl::isVirtual needs to check the canonical declaration. Fixes PR4878. llvm-svn: 81715 --- clang/include/clang/AST/DeclCXX.h | 9 +++++++-- clang/test/SemaCXX/attr-deprecated.cpp | 10 ++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index 7fdb820ae3a3..4d7c674835be 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/include/clang/AST/DeclCXX.h @@ -776,8 +776,13 @@ public: bool isInstance() const { return !isStatic(); } bool isVirtual() const { - return isVirtualAsWritten() || - (begin_overridden_methods() != end_overridden_methods()); + CXXMethodDecl *CD = + cast(const_cast(this)->getCanonicalDecl()); + + if (CD->isVirtualAsWritten()) + return true; + + return (CD->begin_overridden_methods() != CD->end_overridden_methods()); } /// diff --git a/clang/test/SemaCXX/attr-deprecated.cpp b/clang/test/SemaCXX/attr-deprecated.cpp index c1bdfcca97c8..54f8b5b57fcd 100644 --- a/clang/test/SemaCXX/attr-deprecated.cpp +++ b/clang/test/SemaCXX/attr-deprecated.cpp @@ -54,3 +54,13 @@ void f(B* b, C *c) { c->C::f(); c->B::f(); // expected-warning{{'f' is deprecated}} } + +struct D { + virtual void f() __attribute__((deprecated)); +}; + +void D::f() { } + +void f(D* d) { + d->f(); +}