[cfe-dev] Find Type by name

Roman Popov via cfe-dev cfe-dev at lists.llvm.org
Wed Feb 28 18:07:59 PST 2018


Ok, let me run the code in debugger to understand how it makes decision
when to print U.

2018-02-28 18:05 GMT-08:00 Artem Dergachev <noqnoqneo at gmail.com>:

> Huh, nice one. It means that the problem is somewhere in
> QualType::getQualifiedNameAsString(). No, it doesn't seem to be fixed in
> trunk. This might be an easy and welcomed patch.
>
> On 28/02/2018 5:56 PM, Roman Popov wrote:
>
>> Btw, I'm using Clang 5.0, probably it is already fixed in trunk?
>>
>> 2018-02-28 17:54 GMT-08:00 Roman Popov <ripopov at gmail.com <mailto:
>> ripopov at gmail.com>>:
>>
>>     Yes, it matches indeed vs my_nm::my_type<int, 10>.
>>
>>     I think this is a bug in*asString() *matcher: Here is reproducer:
>>
>>     *namespace my_nm {*
>>     *template<typename T, unsigned U>*
>>     *struct my_type {  };*
>>     *}*
>>     *
>>     *
>>     *my_nm::my_type<int, 10> m1;*
>>     *my_nm::my_type<int, 11u> m2;*
>>
>>     LLVM IR  generator correctly generates both types with unsigned
>>     second parameter. But AST Matcher thinks that m1 has signed
>>     parameter, and m2 has unsigned:
>>
>>     m1 matches vs *my_nm::my_type<int, 10>*
>>     m2 matches vs *my_nm::my_type<int, 11U> *(notice capital U)
>>
>>     In LLVM IR types are *my_nm::my_type<int, 10u> and
>>     *my_nm::my_type<int, 11u> **
>>
>>
>>     Thanks, Roman
>>
>>
>>
>>     2018-02-28 17:37 GMT-08:00 Artem Dergachev <noqnoqneo at gmail.com
>>     <mailto:noqnoqneo at gmail.com>>:
>>
>>
>>         Sorry i don't have a quick way of trying this at the moment;
>>         Does it work with "struct my_nm::my_type<int, 10>"? - because
>>         that's what i see in clang's -ast-dump. Does
>>         varDecl(hasType(asString(...))) work? If you match qualType()
>>         and dump .getAsString() on all results, what do you see?
>>
>>         Cause i think it should ultimately work.
>>
>>         On 28/02/2018 2:12 PM, Roman Popov wrote:
>>
>>             Thanks Artem. This is what I've tried before writing
>>             original mail. However it does not work, I got zero matches.
>>
>>             Here is reproducer:
>>
>>             *namespace my_nm {*
>>             *template<typename T, unsigned U>*
>>             *struct my_type {  };*
>>             *}*
>>             *
>>             *
>>             *my_nm::my_type<int, 10> m;
>>             *
>>
>>
>>             I got types from LLVM IR analysis, and then want to find
>>             them in Clang AST.
>>
>>             From LLVM I got mangled name:
>>             *N5my_nm7my_typeIiLj10EEE*
>>
>>             Demangled to:
>>             *my_nm::my_type<int, 10u>*
>>
>>             However I can't find it by any matcher:
>>
>>             auto matches =
>>             match(qualType(asString("*my_nm::my_type<int,
>>             10u>*")).bind("types"), astCtx);  // Zero matches
>>
>>             auto matches =
>>             match(qualType(asString("*N5my_nm7my_typeIiLj10EEE*")).bind(
>> "types"),
>>             astCtx);  // Zero matches
>>
>>             Probably there is some other way to go back from LLVM IR
>>             to Clang AST?
>>
>>
>>             Thanks,
>>             Roman
>>
>>
>>             2018-02-28 12:36 GMT-08:00 Artem Dergachev
>>             <noqnoqneo at gmail.com <mailto:noqnoqneo at gmail.com>
>>             <mailto:noqnoqneo at gmail.com <mailto:noqnoqneo at gmail.com>>>:
>>
>>                 I don't think it's possible via straightforward lookup
>>             - you might
>>                 need to scan the AST to do this.
>>
>>                 Eg. using ASTMatchers:
>>
>>                     qualType(asString("my_nm::my_type<int, 10u>"))
>>
>>                 Or, if you're not using ASTMatchers (likely), you can
>>             do the same
>>                 with a RecursiveASTVisitor. Or manually.
>>
>>
>>                 On 27/02/2018 10:56 AM, Roman Popov via cfe-dev wrote:
>>
>>                     Hello,
>>
>>                     Is it possible to find type in AST by it's
>>             qualified type?
>>
>>                     For example I have string "my_nm::my_type<int,
>>             10u>", how can
>>                     I get clang::QualType if type is present in
>>             translation unit?
>>
>>                     Thanks,
>>                     Roman
>>
>>
>>                     _______________________________________________
>>                     cfe-dev mailing list
>>             cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>             <mailto:cfe-dev at lists.llvm.org
>>             <mailto:cfe-dev at lists.llvm.org>>
>>             http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>             <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev>
>>
>>             <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>             <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/20180228/b6c71b6a/attachment.html>


More information about the cfe-dev mailing list