diff options
-rw-r--r-- | include/clang/AST/DeclCXX.h | 9 | ||||
-rw-r--r-- | test/SemaCXX/attr-deprecated.cpp | 10 |
2 files changed, 17 insertions, 2 deletions
diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index 7fdb820ae3..4d7c674835 100644 --- a/include/clang/AST/DeclCXX.h +++ b/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<CXXMethodDecl>(const_cast<CXXMethodDecl*>(this)->getCanonicalDecl()); + + if (CD->isVirtualAsWritten()) + return true; + + return (CD->begin_overridden_methods() != CD->end_overridden_methods()); } /// diff --git a/test/SemaCXX/attr-deprecated.cpp b/test/SemaCXX/attr-deprecated.cpp index c1bdfcca97..54f8b5b57f 100644 --- a/test/SemaCXX/attr-deprecated.cpp +++ b/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(); +} |