[PATCH] D144405: [clang][pp] Handle attributes defined by plugin in __has_attribute
Erich Keane via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 6 06:35:49 PST 2023
erichkeane added inline comments.
================
Comment at: clang/lib/Basic/Attributes.cpp:46
+ for (auto &AttrPlugin : getAttributePluginInstances()) {
+ for (auto &S : AttrPlugin->Spellings)
+ if (S.Syntax == Syntax && S.NormalizedFullName == Name)
----------------
wanders wrote:
> erichkeane wrote:
> > I think this should be a property of the AttributePlugin type, where you send it the Syntax/Name and it checks to see if it is provided.
> Do you think I should do something like this?
>
> (refactor based on mainline)
>
> ```
> diff --git a/clang/include/clang/Sema/ParsedAttr.h b/clang/include/clang/Sema/ParsedAttr.h
> index f060564e6719..635580ac599b 100644
> --- a/clang/include/clang/Sema/ParsedAttr.h
> +++ b/clang/include/clang/Sema/ParsedAttr.h
> @@ -98,6 +98,13 @@ protected:
> public:
> virtual ~ParsedAttrInfo() = default;
>
> + /// Check if this attribute can be spelled like this. Only used for plugin attributes
> + virtual bool hasSpelling(AttributeCommonInfo::Syntax Syntax, StringRef Name) {
> + return llvm::any_of(Spellings, [&] (const Spelling &S) {
> + return (S.Syntax == Syntax && S.NormalizedFullName == Name);
> + });
> + }
> +
> /// Check if this attribute appertains to D, and issue a diagnostic if not.
> virtual bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr,
> const Decl *D) const {
> diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
> index c1e39acb14ec..b53132d73d79 100644
> --- a/clang/lib/Sema/ParsedAttr.cpp
> +++ b/clang/lib/Sema/ParsedAttr.cpp
> @@ -135,8 +135,7 @@ const ParsedAttrInfo &ParsedAttrInfo::get(const AttributeCommonInfo &A) {
> SyntaxUsed = AttributeCommonInfo::AS_Keyword;
>
> for (auto &Ptr : *PluginAttrInstances)
> - for (auto &S : Ptr->Spellings)
> - if (S.Syntax == SyntaxUsed && S.NormalizedFullName == FullName)
> + if (Ptr->handlesSpelling(SyntaxUsed, FullName))
> return *Ptr;
>
> // If we failed to find a match then return a default ParsedAttrInfo.
> ```
>
> Maybe not `virtual` as allowing plugins to handle attributes not in their Spellings array maybe is too flexible?
Hi-
Sorry for the delayed response: you caught me out of the office.
Yes, that is what I meant. I would NOT make it virtual (for the reason you stated).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D144405/new/
https://reviews.llvm.org/D144405
More information about the cfe-commits
mailing list