[cfe-dev] Adding support for {Class, ...}TemplateDeclSpecialization to libClang

Florian Jung via cfe-dev cfe-dev at lists.llvm.org
Wed Feb 21 10:04:55 PST 2018


Hello all,

libclang does currently not allow retrieving information about implicit 
nor explicit template instantiations. A visitor function passed to 
clang_visitChildren() will be called for the template definition itself, 
but not for any template instantiation.

This is a problem when one needs information that requires a knowledge 
of the actual template parameters, for example the MemberRef access 
"foo.x" in boop() has an empty spelling and no useful definition cursor set

template <class T> struct Foo { T x; };

template <class T> struct Bar { Foo<T> foo; void boop() { auto x = 
foo.x; } };

int main() { Bar<int> b; b.boop(); }


The code seems to already have some code considering 
ClassTemplateSpecializations, namely in libclang/CIndex.cpp, there's a 
bool CursorVisitor::VisitClassTemplateSpecializationDecl() method. 
However, it never gets called, which I've verified by placing a debug 
std::cout in there.

I propose to add code to visit the explicit and implicit 
specialisations, adding an appropriate CursorType and possibly a 
function to query whether the Cursor is an implicit or an explicit 
template specialisation. This would happen in analogy to clang++'s 
-dump-ast option, putting the specialisations as children below the 
ClassTemplateDecl as parent.

I've attached a (very dirty) patch as proof of concept: In 
CursorVisitor::VisitClassTemplateDecl(), it iterates over all 
specialisations and calls VisitClassTemplateSpecializationDecl() on them.

This is not beautiful yet, because it still won't expose any "Template 
Specialisation" Cursor to the application, but at least all of its 
children. Also, function and variable templates might require the same 
treatment.


Given that the actual Specialisation was visited (and the children only 
when the visitor function returned CXChildVisit_Recurse), would such a 
change be merged into upstream libclang? I would really need such a 
feature, and it seems like a similar request has already been made [1].

What do I need to watch out for when implementing this, to not break any 
software which uses libclang? (Ideally, it should just return 
CXChildVisit_Continue on the newly added cursors, so it won't notice much)

And what's the purpose of the existing 
VisitClassTemplateSpecializationDecl() method in its current state?


Kind regards,

Florian


[1] "[cfe-dev] Will libclang ever be able to step through classes 
defined by template instantiations?", Wed Dec 6 08:35:49 PST 2017

-------------- next part --------------
A non-text attachment was scrubbed...
Name: proof_of_concept.patch
Type: text/x-patch
Size: 1611 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180221/ac8d2400/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5437 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180221/ac8d2400/attachment-0001.bin>


More information about the cfe-dev mailing list