diff options
author | Anders Carlsson <andersca@mac.com> | 2011-01-23 21:07:30 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2011-01-23 21:07:30 +0000 |
commit | f89e0424b8903438179f4a2f16dddd5e5bdc814e (patch) | |
tree | 713f8065268178762184e29dde6e959c8a7bb91e /lib | |
parent | 3176cca2fe2bb9ab061e8e5fc05b4d59403fcf19 (diff) |
Get rid of the [[final]] C++0x attribute.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124083 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/CGExprCXX.cpp | 10 | ||||
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 1 | ||||
-rw-r--r-- | lib/Sema/AttributeList.cpp | 1 | ||||
-rw-r--r-- | lib/Sema/SemaDeclAttr.cpp | 37 | ||||
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 25 |
5 files changed, 17 insertions, 57 deletions
diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index 5521c0f8ce..9ce90c0ce8 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -63,14 +63,14 @@ static bool canDevirtualizeMemberFunctionCalls(ASTContext &Context, if (Context.getLangOptions().AppleKext) return false; - // If the member function has the "final" attribute, we know that it can't be + // If the member function is marked 'final', we know that it can't be // overridden and can therefore devirtualize it. - if (MD->hasAttr<FinalAttr>()) + if (MD->isMarkedFinal()) return true; - // Similarly, if the class itself has the "final" attribute it can't be - // overridden and we can therefore devirtualize the member function call. - if (MD->getParent()->hasAttr<FinalAttr>()) + // Similarly, if the class itself is marked 'final' it can't be overridden + // and we can therefore devirtualize the member function call. + if (MD->getParent()->isMarkedFinal()) return true; if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) { diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 4d16f033be..44c6921715 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -2223,7 +2223,6 @@ void Parser::ParseCXX0XAttributes(ParsedAttributesWithRange &attrs, // No arguments case AttributeList::AT_base_check: case AttributeList::AT_carries_dependency: - case AttributeList::AT_final: case AttributeList::AT_hiding: case AttributeList::AT_noreturn: case AttributeList::AT_override: { diff --git a/lib/Sema/AttributeList.cpp b/lib/Sema/AttributeList.cpp index 6e0a332104..d8d0c7b1a7 100644 --- a/lib/Sema/AttributeList.cpp +++ b/lib/Sema/AttributeList.cpp @@ -51,7 +51,6 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { .Case("used", AT_used) .Case("alias", AT_alias) .Case("align", AT_aligned) - .Case("final", AT_final) .Case("cdecl", AT_cdecl) .Case("const", AT_const) .Case("__const", AT_const) // some GCC headers do contain this spelling diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 9c9846ebf5..88afaf30b7 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2437,32 +2437,6 @@ static void HandleLaunchBoundsAttr(Decl *d, const AttributeList &Attr, Sema &S){ } } -static void HandleFinalAttr(Decl *d, const AttributeList &Attr, Sema &S) { - // check the attribute arguments. - if (Attr.getNumArgs() != 0) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0; - return; - } - - if (!isa<CXXRecordDecl>(d) - && (!isa<CXXMethodDecl>(d) || !cast<CXXMethodDecl>(d)->isVirtual())) { - S.Diag(Attr.getLoc(), - Attr.isCXX0XAttribute() ? diag::err_attribute_wrong_decl_type - : diag::warn_attribute_wrong_decl_type) - << Attr.getName() << 7 /*virtual method or class*/; - return; - } - - // FIXME: Conform to C++0x redeclaration rules. - - if (d->getAttr<FinalAttr>()) { - S.Diag(Attr.getLoc(), diag::err_repeat_attribute) << "final"; - return; - } - - d->addAttr(::new (S.Context) FinalAttr(Attr.getLoc(), S.Context)); -} - //===----------------------------------------------------------------------===// // C++0x member checking attributes //===----------------------------------------------------------------------===// @@ -2632,11 +2606,11 @@ static void HandleUuidAttr(Decl *d, const AttributeList &Attr, Sema &S) { // GUID format is "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" or // "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - llvm::StringRef::iterator I = StrRef.begin();
- if (IsCurly) // Skip the optional '{'
- ++I;
-
- for (int i = 0; i < 36; ++i) {
+ llvm::StringRef::iterator I = StrRef.begin(); + if (IsCurly) // Skip the optional '{' + ++I; + + for (int i = 0; i < 36; ++i) { if (i == 8 || i == 13 || i == 18 || i == 23) { if (*I != '-') { S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid); @@ -2709,7 +2683,6 @@ static void ProcessInheritableDeclAttr(Scope *scope, Decl *D, case AttributeList::AT_ext_vector_type: HandleExtVectorTypeAttr(scope, D, Attr, S); break; - case AttributeList::AT_final: HandleFinalAttr (D, Attr, S); break; case AttributeList::AT_format: HandleFormatAttr (D, Attr, S); break; case AttributeList::AT_format_arg: HandleFormatArgAttr (D, Attr, S); break; case AttributeList::AT_global: HandleGlobalAttr (D, Attr, S); break; diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 9def74d954..eeb665b61d 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -533,15 +533,6 @@ Sema::CheckBaseSpecifier(CXXRecordDecl *Class, return 0; } - // FIXME: Get rid of this. - // C++0x CWG Issue #817 indicates that [[final]] classes shouldn't be bases. - if (CXXBaseDecl->hasAttr<FinalAttr>()) { - Diag(BaseLoc, diag::err_final_base) << BaseType.getAsString(); - Diag(CXXBaseDecl->getLocation(), diag::note_previous_decl) - << BaseType; - return 0; - } - if (BaseDecl->isInvalidDecl()) Class->setInvalidDecl(); @@ -913,15 +904,13 @@ void Sema::CheckOverrideControl(const Decl *D) { /// 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; + if (!Old->isMarkedFinal()) + return false; + + Diag(New->getLocation(), diag::err_final_function_overridden) + << New->getDeclName(); + Diag(Old->getLocation(), diag::note_overridden_virtual_function); + return true; } /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member |