diff options
author | Anders Carlsson <andersca@mac.com> | 2011-01-24 16:26:15 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2011-01-24 16:26:15 +0000 |
commit | cb88a1f968c3d4eb451dafb421a8d9578edcbf1a (patch) | |
tree | c3a526323d5b899cbad4202ad847d83db35f15c6 /lib/Sema | |
parent | 8dde14e7f43a4b29e592b3e8e576eb467ddb6c6e (diff) |
Use attributes for all the override control specifiers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124122 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 6 | ||||
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 14 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 3 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 2 |
4 files changed, 11 insertions, 14 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 85df57a76c..4d8179738a 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -6386,8 +6386,10 @@ void Sema::ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagD, if (!Record->getIdentifier()) return; - Record->setIsMarkedFinal(CVS.isFinalSpecified()); - Record->setIsMarkedExplicit(CVS.isExplicitSpecified()); + if (CVS.isFinalSpecified()) + Record->addAttr(new (Context) FinalAttr(CVS.getFinalLoc(), Context)); + if (CVS.isExplicitSpecified()) + Record->addAttr(new (Context) ExplicitAttr(CVS.getExplicitLoc(), Context)); // C++ [class]p2: // [...] The class-name is also inserted into the scope of the diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index eeb665b61d..25d0a5effe 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -525,7 +525,7 @@ Sema::CheckBaseSpecifier(CXXRecordDecl *Class, // If a class is marked with the class-virt-specifier final and it appears // as a base-type-specifier in a base-clause (10 class.derived), the program // is ill-formed. - if (CXXBaseDecl->isMarkedFinal()) { + if (CXXBaseDecl->hasAttr<FinalAttr>()) { Diag(BaseLoc, diag::err_class_marked_final_used_as_base) << CXXBaseDecl->getDeclName(); Diag(CXXBaseDecl->getLocation(), diag::note_previous_decl) @@ -871,7 +871,7 @@ void Sema::CheckOverrideControl(const Decl *D) { // the program is ill-formed. bool HasOverriddenMethods = MD->begin_overridden_methods() != MD->end_overridden_methods(); - if (MD->isMarkedOverride() && !HasOverriddenMethods) { + if (MD->hasAttr<OverrideAttr>() && !HasOverriddenMethods) { Diag(MD->getLocation(), diag::err_function_marked_override_not_overriding) << MD->getDeclName(); @@ -883,8 +883,8 @@ void Sema::CheckOverrideControl(const Decl *D) { // if a virtual member function that is neither implicitly-declared nor a // destructor overrides a member function of a base class and it is not // marked with the virt-specifier override, the program is ill-formed. - if (MD->getParent()->isMarkedExplicit() && !isa<CXXDestructorDecl>(MD) && - HasOverriddenMethods && !MD->isMarkedOverride()) { + if (MD->getParent()->hasAttr<ExplicitAttr>() && !isa<CXXDestructorDecl>(MD) && + HasOverriddenMethods && !MD->hasAttr<OverrideAttr>()) { llvm::SmallVector<const CXXMethodDecl*, 4> OverriddenMethods(MD->begin_overridden_methods(), MD->end_overridden_methods()); @@ -904,7 +904,7 @@ void Sema::CheckOverrideControl(const Decl *D) { /// C++0x [class.virtual]p3. bool Sema::CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, const CXXMethodDecl *Old) { - if (!Old->isMarkedFinal()) + if (!Old->hasAttr<FinalAttr>()) return false; Diag(New->getLocation(), diag::err_final_function_overridden) @@ -1057,7 +1057,7 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, diag::override_keyword_only_allowed_on_virtual_member_functions) << "override" << FixItHint::CreateRemoval(VS.getOverrideLoc()); } else - MD->setIsMarkedOverride(true); + MD->addAttr(new (Context) OverrideAttr(VS.getOverrideLoc(), Context)); } if (VS.isFinalSpecified()) { CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member); @@ -1066,7 +1066,7 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, diag::override_keyword_only_allowed_on_virtual_member_functions) << "final" << FixItHint::CreateRemoval(VS.getFinalLoc()); } else - MD->setIsMarkedFinal(true); + MD->addAttr(new (Context) FinalAttr(VS.getFinalLoc(), Context)); } CheckOverrideControl(Member); diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 2102073682..45fde296e3 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -1640,9 +1640,6 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, Instantiation->setTagKind(Pattern->getTagKind()); - Instantiation->setIsMarkedFinal(Pattern->isMarkedFinal()); - Instantiation->setIsMarkedExplicit(Pattern->isMarkedExplicit()); - // Do substitution on the base class specifiers. if (SubstBaseSpecifiers(Instantiation, Pattern, TemplateArgs)) Invalid = true; diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 5238ad6dfc..759e2c16f1 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -1389,8 +1389,6 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D, if (D->isPure()) SemaRef.CheckPureMethod(Method, SourceRange()); - Method->setIsMarkedOverride(D->isMarkedOverride()); - Method->setIsMarkedFinal(D->isMarkedFinal()); Method->setAccess(D->getAccess()); SemaRef.CheckOverrideControl(Method); |