diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 5 | ||||
-rw-r--r-- | lib/Sema/AttributeList.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 47 | ||||
-rw-r--r-- | lib/Sema/SemaDeclAttr.cpp | 79 |
4 files changed, 1 insertions, 132 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 44c6921715..b077f73baa 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -2221,11 +2221,8 @@ void Parser::ParseCXX0XAttributes(ParsedAttributesWithRange &attrs, switch(AttributeList::getKind(AttrName)) { // No arguments - case AttributeList::AT_base_check: case AttributeList::AT_carries_dependency: - case AttributeList::AT_hiding: - case AttributeList::AT_noreturn: - case AttributeList::AT_override: { + case AttributeList::AT_noreturn: { if (Tok.is(tok::l_paren)) { Diag(Tok.getLocation(), diag::err_cxx0x_attribute_forbids_arguments) << AttrName->getName(); diff --git a/lib/Sema/AttributeList.cpp b/lib/Sema/AttributeList.cpp index d8d0c7b1a7..f5149a3ce5 100644 --- a/lib/Sema/AttributeList.cpp +++ b/lib/Sema/AttributeList.cpp @@ -56,7 +56,6 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { .Case("__const", AT_const) // some GCC headers do contain this spelling .Case("blocks", AT_blocks) .Case("format", AT_format) - .Case("hiding", AT_hiding) .Case("malloc", AT_malloc) .Case("packed", AT_packed) .Case("unused", AT_unused) @@ -77,7 +76,6 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { .Case("iboutletcollection", AT_IBOutletCollection) .Case("noreturn", AT_noreturn) .Case("noinline", AT_noinline) - .Case("override", AT_override) .Case("sentinel", AT_sentinel) .Case("NSObject", AT_nsobject) .Case("dllimport", AT_dllimport) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 62adcf9bb1..85df57a76c 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3372,52 +3372,6 @@ static void DiagnoseInvalidRedeclaration(Sema &S, FunctionDecl *NewFD) { } } -/// CheckClassMemberNameAttributes - Check for class member name checking -/// attributes according to [dcl.attr.override] -static void -CheckClassMemberNameAttributes(Sema& SemaRef, const FunctionDecl *FD) { - const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD); - if (!MD || !MD->isVirtual()) - return; - - bool HasOverrideAttr = MD->hasAttr<OverrideAttr>(); - bool HasOverriddenMethods = - MD->begin_overridden_methods() != MD->end_overridden_methods(); - - /// C++ [dcl.attr.override]p2: - /// If a virtual member function f is marked override and does not override - /// a member function of a base class the program is ill-formed. - if (HasOverrideAttr && !HasOverriddenMethods) { - SemaRef.Diag(MD->getLocation(), - diag::err_function_marked_override_not_overriding) - << MD->getDeclName(); - return; - } - - if (!MD->getParent()->hasAttr<BaseCheckAttr>()) - return; - - /// C++ [dcl.attr.override]p6: - /// In a class definition marked base_check, 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 override, the - /// program is ill-formed. - if (HasOverriddenMethods && !HasOverrideAttr && !MD->isImplicit() && - !isa<CXXDestructorDecl>(MD)) { - llvm::SmallVector<const CXXMethodDecl*, 4> - OverriddenMethods(MD->begin_overridden_methods(), - MD->end_overridden_methods()); - - SemaRef.Diag(MD->getLocation(), - diag::err_function_overriding_without_override) - << MD->getDeclName() << (unsigned)OverriddenMethods.size(); - - for (unsigned I = 0; I != OverriddenMethods.size(); ++I) - SemaRef.Diag(OverriddenMethods[I]->getLocation(), - diag::note_overridden_virtual_function); - } -} - NamedDecl* Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, QualType R, TypeSourceInfo *TInfo, @@ -4095,7 +4049,6 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, FunctionTemplate->setInvalidDecl(); return FunctionTemplate; } - CheckClassMemberNameAttributes(*this, NewFD); } MarkUnusedFileScopedDecl(NewFD); diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 88afaf30b7..dce229b628 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2438,82 +2438,6 @@ static void HandleLaunchBoundsAttr(Decl *d, const AttributeList &Attr, Sema &S){ } //===----------------------------------------------------------------------===// -// C++0x member checking attributes -//===----------------------------------------------------------------------===// - -static void HandleBaseCheckAttr(Decl *d, const AttributeList &Attr, Sema &S) { - if (Attr.getNumArgs() != 0) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0; - return; - } - - if (!isa<CXXRecordDecl>(d)) { - S.Diag(Attr.getLoc(), - Attr.isCXX0XAttribute() ? diag::err_attribute_wrong_decl_type - : diag::warn_attribute_wrong_decl_type) - << Attr.getName() << 9 /*class*/; - return; - } - - if (d->getAttr<BaseCheckAttr>()) { - S.Diag(Attr.getLoc(), diag::err_repeat_attribute) << "base_check"; - return; - } - - d->addAttr(::new (S.Context) BaseCheckAttr(Attr.getLoc(), S.Context)); -} - -static void HandleHidingAttr(Decl *d, const AttributeList &Attr, Sema &S) { - if (Attr.getNumArgs() != 0) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0; - return; - } - - if (!isa<RecordDecl>(d->getDeclContext())) { - // FIXME: It's not the type that's the problem - S.Diag(Attr.getLoc(), - Attr.isCXX0XAttribute() ? diag::err_attribute_wrong_decl_type - : diag::warn_attribute_wrong_decl_type) - << Attr.getName() << 11 /*member*/; - return; - } - - // FIXME: Conform to C++0x redeclaration rules. - - if (d->getAttr<HidingAttr>()) { - S.Diag(Attr.getLoc(), diag::err_repeat_attribute) << "hiding"; - return; - } - - d->addAttr(::new (S.Context) HidingAttr(Attr.getLoc(), S.Context)); -} - -static void HandleOverrideAttr(Decl *d, const AttributeList &Attr, Sema &S) { - if (Attr.getNumArgs() != 0) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0; - return; - } - - if (!isa<CXXMethodDecl>(d) || !cast<CXXMethodDecl>(d)->isVirtual()) { - // FIXME: It's not the type that's the problem - S.Diag(Attr.getLoc(), - Attr.isCXX0XAttribute() ? diag::err_attribute_wrong_decl_type - : diag::warn_attribute_wrong_decl_type) - << Attr.getName() << 10 /*virtual method*/; - return; - } - - // FIXME: Conform to C++0x redeclaration rules. - - if (d->getAttr<OverrideAttr>()) { - S.Diag(Attr.getLoc(), diag::err_repeat_attribute) << "override"; - return; - } - - d->addAttr(::new (S.Context) OverrideAttr(Attr.getLoc(), S.Context)); -} - -//===----------------------------------------------------------------------===// // Checker-specific attribute handlers. //===----------------------------------------------------------------------===// @@ -2672,7 +2596,6 @@ static void ProcessInheritableDeclAttr(Scope *scope, Decl *D, case AttributeList::AT_analyzer_noreturn: HandleAnalyzerNoReturnAttr (D, Attr, S); break; case AttributeList::AT_annotate: HandleAnnotateAttr (D, Attr, S); break; - case AttributeList::AT_base_check: HandleBaseCheckAttr (D, Attr, S); break; case AttributeList::AT_carries_dependency: HandleDependencyAttr (D, Attr, S); break; case AttributeList::AT_common: HandleCommonAttr (D, Attr, S); break; @@ -2687,7 +2610,6 @@ static void ProcessInheritableDeclAttr(Scope *scope, Decl *D, case AttributeList::AT_format_arg: HandleFormatArgAttr (D, Attr, S); break; case AttributeList::AT_global: HandleGlobalAttr (D, Attr, S); break; case AttributeList::AT_gnu_inline: HandleGNUInlineAttr (D, Attr, S); break; - case AttributeList::AT_hiding: HandleHidingAttr (D, Attr, S); break; case AttributeList::AT_launch_bounds: HandleLaunchBoundsAttr(D, Attr, S); break; @@ -2703,7 +2625,6 @@ static void ProcessInheritableDeclAttr(Scope *scope, Decl *D, case AttributeList::AT_naked: HandleNakedAttr (D, Attr, S); break; case AttributeList::AT_noreturn: HandleNoReturnAttr (D, Attr, S); break; case AttributeList::AT_nothrow: HandleNothrowAttr (D, Attr, S); break; - case AttributeList::AT_override: HandleOverrideAttr (D, Attr, S); break; case AttributeList::AT_shared: HandleSharedAttr (D, Attr, S); break; case AttributeList::AT_vecreturn: HandleVecReturnAttr (D, Attr, S); break; |