[cfe-dev] CXCursor_CXXBaseSpecifier for template instantiated base class

Michael via cfe-dev cfe-dev at lists.llvm.org
Thu Mar 16 14:19:05 PDT 2017


Hmm, I don’t have my code atm. to compare, but yes, I think this is what I mean.


> On 16 Mar 2017, at 20:07, Nestal Wan <me at nestal.net> wrote:
> 
> Do you mean this?
> 
> | `-ClassTemplateSpecializationDecl 0x557ff8ef4e10 <line:16:1,
> line:25:1> line:17:7 class RecursiveBase definition
> |   |-public 'class Base':'class Base'
> |   |-TemplateArgument type 'class Base'
> |   |-CXXRecordDecl 0x557ff8ef5098 prev 0x557ff8ef4e10 <col:1, col:7>
> col:7 implicit class RecursiveBase
> |   |-AccessSpecDecl 0x557ff8ef5130 <line:19:1, col:7> col:1 public
> 
> I can see it from the AST dump, but not know how to get a cursor to it.
> 
> 
> On Fri, Mar 17, 2017 at 3:01 AM, Michael <redm at gmx.de> wrote:
>> Well, at least for me it didn't really help, it did not do what I would have
>> expected it to do... i.e. return the specialized versions of the template,
>> "RecursiveBase<Base>" and more importantly it's base "Base" in your example.
>> 
>> 
>> 
>> On 03/16/2017 07:16 PM, Nestal Wan wrote:
>>> 
>>> Yes. I think clang_getSpecializedCursorTemplate() will definitely be
>>> useful for me. Thanks for the info.
>>> 
>>> On Thu, Mar 16, 2017 at 2:02 AM, Michael via cfe-dev
>>> <cfe-dev at lists.llvm.org> wrote:
>>>> 
>>>> This is an interesting question I was also wondering about the other
>>>> day...
>>>> (sorry, if you were hoping for an answer;)
>>>> 
>>>> The best thing I figured out was: get the type of template parameter
>>>> RecursiveBase<Base> (via clang_Type_getTemplateArgumentAsType), then go
>>>> to
>>>> the referenced template RecursiveBase and do the parameter mapping
>>>> myself.
>>>> Of course this will get more complicated if that again derives from a
>>>> template using that parameter...
>>>> 
>>>> Running the example through "clang++ -Xclang -ast-dump -fsyntax-only .."
>>>> I
>>>> see the needed ClassTemplateSpecializationDecls, also for further base
>>>> templates, carrying the proper specialized parameter types...
>>>> 
>>>> I would have expected clang_getSpecializedCursorTemplate giving me these
>>>> specialized versions of the templates, but either I understand it wrong
>>>> what
>>>> is supposed to do or it's implementation is incomplete here? Some insight
>>>> on
>>>> this question would be appreciated.
>>>> 
>>>> Thanks
>>>> 
>>>> Michael
>>>> 
>>>> 
>>>> 
>>>> On 03/14/2017 05:39 PM, Nestal Wan via cfe-dev wrote:
>>>>> 
>>>>> 
>>>>> Thanks Adi,
>>>>> 
>>>>> Like you said, I solve the problem by fixing the errors that were
>>>>> indicated by the diagnostic messages.
>>>>> 
>>>>> Now I have another question, if you don't mind I keep using this thread.
>>>>> 
>>>>> I wish know the class hierarchy of "Derived". That means getting the
>>>>> base class the the instantiated RecursiveBase<Base> template. That
>>>>> should be "Base".
>>>>> 
>>>>> When I visit "Dervied", I got a cursor to a CXCursor_CXXBaseSpecifier.
>>>>> I tried to get the type by:
>>>>> 
>>>>> CXType recursive_base =
>>>>> clang_getCursorType(clang_getCursorDefinition(cxx_base_specifier));
>>>>> 
>>>>> "recursive_base" refers to the RecursiveBase<Base> instantiation. How
>>>>> can I get the base type of this class? I know I can get the cursor to
>>>>> the template that instantiate it (i.e. template <typename BaseType>
>>>>> RecursiveBase), and I can see it inherits "BaseType" by visiting it
>>>>> and look for CXCursor_CXXBaseSpecifier. But how can I know "BaseType"
>>>>> will become "Base" when we instantiate it? Will the CXType provides me
>>>>> this linkage or I need to use LibTooling instead?
>>>>> 
>>>>> Thanks again.
>>>>> 
>>>>> Nestal
>>>>> 
>>>>> On Sun, Mar 12, 2017 at 9:25 PM, Jusufadis Bakamovic <jbakam at gmail.com>
>>>>> wrote:
>>>>>> 
>>>>>> 
>>>>>> It is hard to tell without more context why you're getting this error,
>>>>>> but
>>>>>> my guess is that you're missing some command line args (i.e. include
>>>>>> paths,
>>>>>> preprocessor flags, etc.) which is specific to the code you're
>>>>>> analyzing
>>>>>> and
>>>>>> which is required in order to get the parsing stage done right. Very
>>>>>> often
>>>>>> this is the case and which is why you should, whenever you have doubts,
>>>>>> always try to come up with a small reproducible example (without
>>>>>> dependencies) and have it validated separately.
>>>>>> 
>>>>>> Additionally, you can try to extract diagnostics for the given
>>>>>> translation
>>>>>> unit and see if you get any hints there. Normally, you should get hints
>>>>>> if
>>>>>> clang parser was not able to fully parse the source code because it was
>>>>>> missing some information such as failing to find particular headers.
>>>>>> 
>>>>>> Cheers,
>>>>>> Adi
>>>>>> 
>>>>>> On 12 March 2017 at 10:13, Nestal Wan <me at nestal.net> wrote:
>>>>>>> 
>>>>>>> 
>>>>>>> Thanks for the reply.
>>>>>>> 
>>>>>>> -CXXRecordDecl 0x55e6db0f5ad8 <line:53:1, line:59:1> line:53:7 invalid
>>>>>>> class
>>>>>>> Derived definition
>>>>>>> 
>>>>>>> | |-public 'class Base2'
>>>>>>> | |-public 'class Base3'
>>>>>>> | |-CXXRecordDecl 0x55e6db0f5df8 <col:1, col:7> col:7 implicit
>>>>>>> referenced
>>>>>>> 
>>>>>>> class Derived
>>>>>>> 
>>>>>>> | |-AccessSpecDecl 0x55e6db0f5e88 <line:55:1, col:7> col:1 public
>>>>>>> | |-CXXConstructorDecl 0x55e6db0f5ef0 <line:56:2, col:20> col:2
>>>>>>> Derived
>>>>>>> 'void
>>>>>>> 
>>>>>>> (void)' noexcept-unevaluated 0x55e6db0f5ef0
>>>>>>> 
>>>>>>> | `-CXXMethodDecl 0x55e6db0f5fd0 <line:58:2, col:24> col:7 Func 'void
>>>>>>> (void)'
>>>>>>> | `-CompoundStmt 0x55e6db0f6118 <col:23, col:24>
>>>>>>> 
>>>>>>> 
>>>>>>> Sometimes I got "invalid class Derived definition", but if I extract
>>>>>>> the
>>>>>>> classes in another source file, the result is different:
>>>>>>> 
>>>>>>> |-CXXRecordDecl 0x55ccfcb583b0 <line:33:1, line:39:1> line:33:7 class
>>>>>>> Derived
>>>>>>> 
>>>>>>> definition
>>>>>>> 
>>>>>>> | |-public 'RecursiveBase<class Base>':'class RecursiveBase<class
>>>>>>> Base>'
>>>>>>> | |-public 'class Base2'
>>>>>>> | |-public 'class Base3'
>>>>>>> | |-CXXRecordDecl 0x55ccfcb58c70 <col:1, col:7> col:7 implicit
>>>>>>> referenced
>>>>>>> 
>>>>>>> class Derived
>>>>>>> 
>>>>>>> What does it mean the class definition is invalid? There is no compile
>>>>>>> error.
>>>>>>> 
>>>>>>> Nestal
>>>>>>> 
>>>>>>> On Sun, Mar 12, 2017 at 4:46 PM, Jusufadis Bakamovic
>>>>>>> <jbakam at gmail.com>
>>>>>>> wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>> You should be getting three times the `CXCursor_CXXBaseSpecifier`,
>>>>>>>> one
>>>>>>>> for
>>>>>>>> each class you're inheriting from. I ran the analysis on my machine
>>>>>>>> (clang
>>>>>>>> 3.8) and that is exactly what I am getting: `RecursiveBase<class
>>>>>>>> Base>`,
>>>>>>>> `Base2`, `Base3`. Maybe you could use `clang -Xclang -ast-dump
>>>>>>>> -fsyntax-only
>>>>>>>> <this_demo>` to see the output of Clang's built-in AST dumper. It
>>>>>>>> should
>>>>>>>> contain these entries. Otherwise, clang version you're running might
>>>>>>>> be
>>>>>>>> an
>>>>>>>> older one.
>>>>>>>> 
>>>>>>>> On 12 March 2017 at 05:09, Nestal Wan via cfe-dev
>>>>>>>> <cfe-dev at lists.llvm.org>
>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Hi,
>>>>>>>>> 
>>>>>>>>> When I use clang_visitChildren() to visit a class, I can't get a
>>>>>>>>> CXCursor_CXXBaseSpecifier for its base class if the base class is a
>>>>>>>>> template. For example:
>>>>>>>>> 
>>>>>>>>> template <typename BaseType>
>>>>>>>>> class RecursiveBase : public BaseType
>>>>>>>>> {
>>>>>>>>> public:
>>>>>>>>>    virtual void SomeFunc()
>>>>>>>>>    {
>>>>>>>>>       // prevent optimizer to remove the function
>>>>>>>>>       global_var++;
>>>>>>>>>    }
>>>>>>>>> };
>>>>>>>>> 
>>>>>>>>> class Derived : public RecursiveBase<Base>, public Base2, public
>>>>>>>>> Base3
>>>>>>>>> {
>>>>>>>>> public:
>>>>>>>>>    Derived() = default;
>>>>>>>>> 
>>>>>>>>>    void Func() override {}
>>>>>>>>> };
>>>>>>>>> 
>>>>>>>>> I can get a CXCursor_CXXBaseSpecifier cursor as children of the
>>>>>>>>> "Derived" cursor, but not RecursiveBase. How can I find out
>>>>>>>>> references
>>>>>>>>> to all base classes including templates?
>>>>>>>>> 
>>>>>>>>> Thanks.
>>>>>>>>> 
>>>>>>>>> Nestal
>>>>>>>>> _______________________________________________
>>>>>>>>> cfe-dev mailing list
>>>>>>>>> cfe-dev at lists.llvm.org
>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>> _______________________________________________
>>>>> cfe-dev mailing list
>>>>> cfe-dev at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>> 
>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> cfe-dev mailing list
>>>> cfe-dev at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>> 
>> 




More information about the cfe-dev mailing list