ClassTemplateSpecializationDecl hasDefinition() == false, how to make it true?

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

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?

Thanks,
Kris

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.

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

Got it to work! Thanks so much Richard. I finally figured out that there is such a thing as a SemaConsumer that gets the Sema instance injected :).