[cfe-dev] How to match clang::attr::Annotate with specific value?

Yafei Liu via cfe-dev cfe-dev at lists.llvm.org
Sun Jul 5 01:57:39 PDT 2020


Hi Andi-Bogdan, do you mean I should do the checking in the MatchCallback,
as long as this cannot be done in a matcher?

On Sun, Jul 5, 2020 at 4:50 PM Andi-Bogdan Postelnicu <andi at mozilla.com>
wrote:

> Some more info about the answer from my previous reply if you want a more
> direct approach you can do something like:
>
> 157 static bool isAnnotatedToAllowDirectAssignment(const Decl
> <https://clang.llvm.org/doxygen/classclang_1_1Decl.html> *D) {
> 158  for (const auto *Ann : D->specific_attrs
> <https://clang.llvm.org/doxygen/classclang_1_1Decl.html#a9c0ac8ddf9155de0b95eeeb18034e50f>
> <AnnotateAttr>())
> 159  if (Ann->getAnnotation() ==
> 160  "objc_allow_direct_instance_variable_assignment")
> 161  return true;
> 162  return false;
> 163 }
> ```
> Of course wrapping this in a custom matcher and modified according to your
> needs, the example was take from `DirectlvarAssignment Checker` [1].
>
> [1] https://clang.llvm.org/doxygen/DirectIvarAssignment_8cpp_source.html
>
> On 5 Jul 2020, at 11:39, Andi-Bogdan Postelnicu <andi at mozilla.com> wrote:
>
> Hello,
>
> Yes of course you can do that, you can first interrogate Decl::hasAttrs
> [1], and if that’s true you can get the AttrVec [2].
> I would suggest to wrapp this in a custom matcher.
>
> Hope this helps!
>
> [1]
> https://clang.llvm.org/doxygen/classclang_1_1Decl.html#a1e0b6223e2547ac65ddbf4802117998b
> [2]
> https://clang.llvm.org/doxygen/classclang_1_1Decl.html#a59463d45ab90b696a368b58d23eb49aa
>
> On 5 Jul 2020, at 11:25, Yafei Liu via cfe-dev <cfe-dev at lists.llvm.org>
> wrote:
>
> For example I have a struct:
>
> struct [[clang::annotate("example")]] ExampleStruct {
>   int i;
>   float f;
>   double d;
>   int* ip;
>   uint32_t ii;
> };
>
> Currently I use the matcher like this:
>
> clang::ast_matchers::cxxRecordDecl(clang::ast_matchers::hasDefinition(),
>     clang::ast_matchers::hasAttr(clang::attr::Annotate)).bind("example_struct");
>
>
> Can I go further by making the matcher check if the annotate is "example"?
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20200705/95c30127/attachment.html>


More information about the cfe-dev mailing list