https://github.com/erichkeane created https://github.com/llvm/llvm-project/pull/78476
As suggested in https://github.com/llvm/llvm-project/pull/78200 This adds a variadic 'dropAttrs', which drops all attributes of any of the types specified. >From 6790e56b001a29e8bba012514eb3b12cd486d505 Mon Sep 17 00:00:00 2001 From: erichkeane <eke...@nvidia.com> Date: Wed, 17 Jan 2024 09:03:14 -0800 Subject: [PATCH] Add Variadic 'dropAttrs' As suggested in https://github.com/llvm/llvm-project/pull/78200 This adds a variadic 'dropAttrs', which drops all attributes of any of the types specified. --- clang/include/clang/AST/DeclBase.h | 11 ++++++++--- clang/lib/Sema/SemaDecl.cpp | 3 +-- clang/lib/Sema/SemaDeclCXX.cpp | 3 +-- clang/lib/Sema/SemaTemplate.cpp | 6 ++---- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index 5b1038582bc6747..933249b4a1a05e0 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -548,17 +548,22 @@ class alignas(8) Decl { return hasAttrs() ? getAttrs().end() : nullptr; } - template <typename T> - void dropAttr() { + template<typename ...Ts> + void dropAttrs() { if (!HasAttrs) return; AttrVec &Vec = getAttrs(); - llvm::erase_if(Vec, [](Attr *A) { return isa<T>(A); }); + llvm::erase_if(Vec, [](Attr *A) { return isa<Ts...>(A); }); if (Vec.empty()) HasAttrs = false; } + template <typename T> + void dropAttr() { + dropAttrs<T>(); + } + template <typename T> llvm::iterator_range<specific_attr_iterator<T>> specific_attrs() const { return llvm::make_range(specific_attr_begin<T>(), specific_attr_end<T>()); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index dae98f3a7406e87..5472b43aafd4f39 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7068,8 +7068,7 @@ static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND) { if (WeakRefAttr *Attr = ND.getAttr<WeakRefAttr>()) { if (ND.isExternallyVisible()) { S.Diag(Attr->getLocation(), diag::err_attribute_weakref_not_static); - ND.dropAttr<WeakRefAttr>(); - ND.dropAttr<AliasAttr>(); + ND.dropAttrs<WeakRefAttr, AliasAttr>(); } } diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index a2ce96188b4f161..62dc623d5af378c 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -6545,8 +6545,7 @@ void Sema::checkClassLevelDLLAttribute(CXXRecordDecl *Class) { if ((Context.getTargetInfo().getCXXABI().isMicrosoft() || Context.getTargetInfo().getTriple().isPS()) && (!Class->isExternallyVisible() && Class->hasExternalFormalLinkage())) { - Class->dropAttr<DLLExportAttr>(); - Class->dropAttr<DLLImportAttr>(); + Class->dropAttrs<DLLExportAttr, DLLImportAttr>(); return; } diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index c0dcbda1fd6221d..b5be596b7dff327 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -9229,10 +9229,8 @@ void Sema::CheckConceptRedefinition(ConceptDecl *NewDecl, /// that has just been explicitly specialized. static void StripImplicitInstantiation(NamedDecl *D, bool MinGW) { if (MinGW || (isa<FunctionDecl>(D) && - cast<FunctionDecl>(D)->isFunctionTemplateSpecialization())) { - D->dropAttr<DLLImportAttr>(); - D->dropAttr<DLLExportAttr>(); - } + cast<FunctionDecl>(D)->isFunctionTemplateSpecialization())) + D->dropAttrs< DLLImportAttr, DLLExportAttr>(); if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) FD->setInlineSpecified(false); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits