diff options
author | Anders Carlsson <andersca@mac.com> | 2011-01-20 16:25:36 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2011-01-20 16:25:36 +0000 |
commit | 2e1c730167d2b978c66558c029d163ffe64b9656 (patch) | |
tree | 894dd1d5d0410fa976d48fe8545ce98130a6069c /lib/Sema/SemaDeclCXX.cpp | |
parent | ac6a858f6b7df4e83e4ad5921565a0b425ea00c3 (diff) |
Diagnose when a virtual member function marked final is overridden.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123916 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index b9d760b412..2f7640cd61 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -875,6 +875,22 @@ void Sema::CheckOverrideControl(const Decl *D) { } } +/// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member +/// function overrides a virtual member function marked 'final', according to +/// C++0x [class.virtual]p3. +bool Sema::CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, + const CXXMethodDecl *Old) { + // FIXME: Get rid of FinalAttr here. + if (Old->hasAttr<FinalAttr>() || Old->isMarkedFinal()) { + Diag(New->getLocation(), diag::err_final_function_overridden) + << New->getDeclName(); + Diag(Old->getLocation(), diag::note_overridden_virtual_function); + return true; + } + + return false; +} + /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the /// bitfield width if there is one and 'InitExpr' specifies the initializer if @@ -6918,19 +6934,6 @@ bool Sema::CheckOverridingFunctionReturnType(const CXXMethodDecl *New, return false; } -bool Sema::CheckOverridingFunctionAttributes(const CXXMethodDecl *New, - const CXXMethodDecl *Old) -{ - if (Old->hasAttr<FinalAttr>()) { - Diag(New->getLocation(), diag::err_final_function_overridden) - << New->getDeclName(); - Diag(Old->getLocation(), diag::note_overridden_virtual_function); - return true; - } - - return false; -} - /// \brief Mark the given method pure. /// /// \param Method the method to be marked pure. |