#include using namespace clice; const char* code = R"( #include template struct X {}; template typename List> struct X> { using type = std::vector; }; template struct test { using result = typename X>::type; }; )"; struct ASTVisitor : public clang::RecursiveASTVisitor { ParsedAST& ast; bool VisitTypeAliasDecl(clang::TypeAliasDecl* decl) { if(decl->getName() == "result") { auto type = decl->getUnderlyingType(); clang::Sema::CodeSynthesisContext context; context.Kind = clang::Sema::CodeSynthesisContext::TemplateInstantiation; context.Entity = decl; context.TemplateArgs = nullptr; ast.sema.pushCodeSynthesisContext(context); auto resolver = DependentNameResolver(ast.sema, ast.context); auto resolved = resolver.resolve(type); resolved->dump(); } return true; } }; int main() { std::vector args{ "clang++", "-std=c++20", "main.cpp", "-resource-dir=/home/ykiko/C++/clice2/build/lib/clang/20", }; auto ast = ParsedAST::build("main.cpp", code, args, nullptr); auto decl = ast->context.getTranslationUnitDecl(); ASTVisitor visitor{.ast = *ast}; visitor.TraverseDecl(decl); return 0; }