================
@@ -193,6 +194,22 @@ class TypeIndexer : public
RecursiveASTVisitor<TypeIndexer> {
return true;
}
+ bool TraverseSubstTemplateTypeParmTypeLoc(SubstTemplateTypeParmTypeLoc TL,
+ bool TraverseQualifier) {
+ const auto *T = TL.getTypePtr();
+ if (!T)
+ return true;
+ auto QT = T->getReplacementType();
+ if (QT.isNull())
+ return true;
+ auto *CXXRD = QT->getAsCXXRecordDecl();
----------------
HighCommander4 wrote:
I believe this is sufficient for our purposes in this issue (tracking
inheritance relationships).
But in the future, if we want to start recording references in instantiations,
we'll need to do something more sophisticated, since a type could reference
multiple symbols.
Consider:
```c++
template <typename T>
struct Template {
T field;
};
template <typename, typename> struct A {};
struct B {};
struct C {};
Template<A<B, C*>> t;
```
Inside `Template<A<B, C*>>`, `T field` instantiates to `A<B, C*> field;`. That
source location, where what's physically written in the source is `T`, should
now actually reference the symbols `A`, `B`, and `C`!
So a proper handling of this would involve running some sort of type visitor on
`QT` to find all referenced decls inside the type, and then calling
`handleReference(D, ...)` for each referenced decl.
Maybe for now we can add a TODO for this?
https://github.com/llvm/llvm-project/pull/177273
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits