-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Variadic 'dropAttrs' #78476
Add Variadic 'dropAttrs' #78476
Conversation
As suggested in llvm#78200 This adds a variadic 'dropAttrs', which drops all attributes of any of the types specified.
@llvm/pr-subscribers-clang Author: Erich Keane (erichkeane) ChangesAs suggested in #78200 This adds a variadic 'dropAttrs', which drops all attributes of any of the types specified. Full diff: https://github.com/llvm/llvm-project/pull/78476.diff 4 Files Affected:
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);
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, that's a nice, easy change!
As suggested in llvm#78200 This adds a variadic 'dropAttrs', which drops all attributes of any of the types specified.
As suggested in #78200
This adds a variadic 'dropAttrs', which drops all attributes of any of the types specified.