aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2011-01-24 16:26:15 +0000
committerAnders Carlsson <andersca@mac.com>2011-01-24 16:26:15 +0000
commitcb88a1f968c3d4eb451dafb421a8d9578edcbf1a (patch)
treec3a526323d5b899cbad4202ad847d83db35f15c6 /lib/Sema
parent8dde14e7f43a4b29e592b3e8e576eb467ddb6c6e (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.cpp6
-rw-r--r--lib/Sema/SemaDeclCXX.cpp14
-rw-r--r--lib/Sema/SemaTemplateInstantiate.cpp3
-rw-r--r--lib/Sema/SemaTemplateInstantiateDecl.cpp2
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);