[cfe-dev] Question about ASTMatcher `typeAliasTemplateDecl` for gsl::owner

Manuel Klimek via cfe-dev cfe-dev at lists.llvm.org
Fri Jul 28 02:27:59 PDT 2017


This is actually a problem with hasDeclaration; I realized that I hadn't
submitted https://reviews.llvm.org/D27104 yet; I now adapted it to also
solve your problem (as this was simpler than fixing the current code).

On Wed, Jul 26, 2017 at 12:02 PM Jonas Toth via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> Hello everybody,
>
> iam working on a clang-tidy-check to handle gsl::owner, at least i try to.
> What iam doing right now, is trying to get the Matchers done and here is
> what I have as testcode for experimentation.
>
> namespace gsl {
> template<typename T> using owner = T;
> }
>
> template<typename T> class vector {};
> template<typename T> using heap_array = vector<T>;
>
> using file = int;
>
> void f() {
>     gsl::owner<int*> owner = new int(10);
>
>     int i = 0;
>     int* no_owner = &i;
>     int** no_owner_at_all = &no_owner;
>
>     file n = 15;
>
>     heap_array<int> array;
> }
>
> // match varDecl(hasType(hasDeclaration(typeAliasDecl())))  # works for
> file
> // match varDecl(hasType(hasDeclaration(typeAliasTemplateDecl())))  #
> works for file
> // match varDecl(hasType(hasDeclaration(typedefNameDecl())))  # works
> for file
> // match
> varDecl(hasType(hasDeclaration(typedefNameDecl(hasName("file"))))) #
> works as well, matching the declaration
> //
> // match typeAliasTemplateDecl() # gets all declaration
> // match typeAliasTemplateDecl(hasName("::gsl::owner")) # gets the
> declaration right
> // match typeAliasTemplateDecl(hasName("heap_array"))   # gets the
> declaration right
> //
> // match varDecl(hasType(hasDeclaration(typeAliasTemplateDecl()))) #
> nothing
> // match
>
> varDecl(hasType(hasDeclaration(typeAliasTemplateDecl(hasName("::gsl::owner")))))
> # nothing
> // match
> varDecl(hasType(hasDeclaration(typeAliasTemplateDecl(hasName("owner")))))
> # nothing
> // match
>
> varDecl(hasType(hasDeclaration(typeAliasTemplateDecl(hasName("::gsl::owner<int
> *>"))))) # nothing
> // match
>
> varDecl(hasType(hasDeclaration(typeAliasTemplateDecl(hasName("heap_array")))))
> # nothing
> // match
>
> varDecl(hasType(hasDeclaration(typeAliasTemplateDecl(hasName("heap_array<int>")))))
> # nothing
>
> Matching Variables, Parameters and so on for Using-Aliases seems to work
> fine, but not for Templated Aliases.
> I tested these, with the current clang-query from Trunk.
>
> Is the way, iam approaching the matcher incorrect or is it some kind of
> bug in typeAliasTemplateDecl?
>
> Thank you very much for your help :)
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://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/20170728/a95a9dc8/attachment.html>


More information about the cfe-dev mailing list