[cfe-dev] ClassTemplateSpecializationDecl hasDefinition() == false, how to make it true?

Kris Rasmussen via cfe-dev cfe-dev at lists.llvm.org
Wed Apr 27 15:00:34 PDT 2016


Hey Richard - thanks for the quick reply. I'll give Sema another look. I
tried to use it originally but stopped after finding that one is not
available on the CompilerInstance passed into
ASTFrontendAction::createASTConsumer. I'll do some more digging and how
best to get a Sema instance.

Thanks,
Kris

On Wed, Apr 27, 2016 at 2:08 PM, Richard Smith <richard at metafoo.co.uk>
wrote:

> On Wed, Apr 27, 2016 at 1:47 PM, Kris Rasmussen via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
>> I learned that the issue here is that ```BarInt``` is an incomplete type
>> because no on has looked at its members. Is there a way to force the
>> instantiation at parse/AST traversal time even if it isn't instantiated by
>> the code being parsed directly?
>>
>
> You could change Clang to do that, but it would be likely to reject a lot
> of valid, real code if you did. If your tool has access to the Sema object,
> you can use RequireCompleteType to try to complete the definitions of the
> classes you need.
>
>
>> Thanks,
>> Kris
>>
>> On Wed, Apr 27, 2016 at 9:29 AM, Kris Rasmussen <
>> kristopher.rasmussen at gmail.com> wrote:
>>
>>> Hi,
>>>
>>> Is anyone able to help me figure out how to ensure
>>> ClassTemplateSpecializationDecls always have definitions so that I can
>>> properly inspect there members with the appropriate type substitutions? I
>>> am visiting template instantiations via
>>> ```shouldVisitTemplateInstantiations() { return true; }```, but I'm finding
>>> that they do not always have a definition attached to them.
>>>
>>> I'm porting a code generation tool from the python clang bindings to C++
>>> using ClangTool and RecursiveASTVisitor. My tool generates lua bindings
>>> from C++ source code. It needs to generate bindings for template
>>> instantiations, and requires knowledge of the template arguments in order
>>> to do so.
>>>
>>> This code will result in a ClassTemplateSpecializationDecl that is
>>> missing its definition (hasDefinition() == false):
>>>
>>> ```
>>>   template<typename T>
>>>   class Bar {
>>>   public:
>>>     T m_t;
>>>   };
>>>   using BarInt = Bar<int>;
>>> ```
>>>
>>> Whereas this code will result in hasDefinition() == true as I want:
>>> ```
>>>   class Foo : public Bar<int> {};
>>> ```
>>>
>>> Thanks for any help you can provide! I've searched the net for answers,
>>> and also browsed the clang source code, but I'll admit that I haven't dug
>>> deeply enough yet to figure out exactly which code path is triggering the
>>> instantiations that are missing definitions yet.
>>>
>>> Thanks,
>>> Kris
>>>
>>
>>
>> _______________________________________________
>> 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/20160427/032f3116/attachment.html>


More information about the cfe-dev mailing list