@@ -469,21 +469,13 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
469469 return ctx.getCanonicalType (spec);
470470 }
471471
472- clang::QualType
473- getDefaultArg (clang::TemplateDecl *decl,
474- const clang::TemplateTypeParmDecl *parm,
475- llvm::ArrayRef<clang::TemplateArgument> currentArgs) {
476- clang::QualType type = parm->getDefaultArgument ().getArgument ().getAsType ();
477- if (!type->isDependentType ()) {
478- return type;
479- }
480-
481- clang::Sema::InstantiatingTemplate Inst (*sema_, loc_, decl);
472+ clang::QualType getSubstType (const clang::Sema::InstantiatingTemplate &Inst,
473+ clang::QualType type,
474+ llvm::ArrayRef<clang::TemplateArgument> args) {
482475 assert (!Inst.isInvalid () && " Invalid instantiation context" );
483-
484476 clang::MultiLevelTemplateArgumentList mtal;
485477 mtal.setKind (clang::TemplateSubstitutionKind::Rewrite);
486- mtal.addOuterTemplateArguments (currentArgs );
478+ mtal.addOuterTemplateArguments (args );
487479
488480 clang::TypeSourceInfo *tsi =
489481 sema_->SubstType (sema_->Context .getTrivialTypeSourceInfo (type), mtal,
@@ -492,6 +484,19 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
492484 return tsi->getType ();
493485 }
494486
487+ clang::QualType
488+ getDefaultArg (clang::TemplateDecl *decl,
489+ const clang::TemplateTypeParmDecl *parm,
490+ llvm::ArrayRef<clang::TemplateArgument> currentArgs) {
491+ clang::QualType type = parm->getDefaultArgument ().getArgument ().getAsType ();
492+ if (!type->isDependentType ()) {
493+ return type;
494+ }
495+
496+ const clang::Sema::InstantiatingTemplate Inst (*sema_, loc_, decl);
497+ return getSubstType (Inst, type, currentArgs);
498+ }
499+
495500 clang::VarDecl *createVarDecl (clang::QualType type, llvm::StringRef name,
496501 clang::StorageClass sclass = clang::SC_None) {
497502 clang::ASTContext &ctx = sema_->Context ;
@@ -553,6 +558,10 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
553558 } else if (const auto *nttp =
554559 llvm::dyn_cast<clang::NonTypeTemplateParmDecl>(param)) {
555560 clang::QualType type = nttp->getType ();
561+ if (type->isDependentType ()) {
562+ const clang::Sema::InstantiatingTemplate Inst (*sema_, loc_, decl);
563+ type = getSubstType (Inst, type, out);
564+ }
556565 clang::DeclRefExpr *var =
557566 createConstexprDeclRefExpr (type, param->getName ());
558567 out.emplace_back (var, true );
@@ -713,7 +722,7 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
713722 clang::TemplateArgumentListInfo explicitTArgs;
714723
715724 {
716- clang::Sema::InstantiatingTemplate Inst (*sema_, loc_, decl);
725+ const clang::Sema::InstantiatingTemplate Inst (*sema_, loc_, decl);
717726 assert (!Inst.isInvalid () && " Invalid instantiation context" );
718727 for (const auto &argloc : lookup.explicitArgs ) {
719728 const auto &arg = argloc.getArgument ();
@@ -724,16 +733,8 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
724733
725734 clang::TemplateArgument inst;
726735 if (arg.getKind () == clang::TemplateArgument::Type) {
727- clang::QualType type = arg.getAsType ();
728- clang::MultiLevelTemplateArgumentList mtal;
729- mtal.setKind (clang::TemplateSubstitutionKind::Rewrite);
730- mtal.addOuterTemplateArguments (ruleTArgs);
731-
732- clang::TypeSourceInfo *tsi =
733- sema_->SubstType (sema_->Context .getTrivialTypeSourceInfo (type),
734- mtal, loc_, clang::DeclarationName ());
735- assert (tsi && " Template argument type instantiation failed" );
736- inst = clang::TemplateArgument (tsi->getType ());
736+ inst = clang::TemplateArgument (
737+ getSubstType (Inst, arg.getAsType (), ruleTArgs));
737738 } else if (arg.getKind () == clang::TemplateArgument::Expression) {
738739 if (auto *expr =
739740 llvm::dyn_cast<clang::DeclRefExpr>(arg.getAsExpr ())) {
@@ -753,7 +754,17 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
753754 }
754755 }
755756
756- clang::DeclarationName &name = lookup.name ;
757+ clang::DeclarationName name = lookup.name ;
758+ if (clang::QualType nameType = name.getCXXNameType ();
759+ !nameType.isNull () && nameType->isDependentType ()) {
760+ const clang::Sema::InstantiatingTemplate Inst (*sema_, loc_, decl);
761+ assert (!Inst.isInvalid () && " Invalid instantiation context" );
762+ clang::MultiLevelTemplateArgumentList mtal;
763+ mtal.setKind (clang::TemplateSubstitutionKind::Rewrite);
764+ mtal.addOuterTemplateArguments (ruleTArgs);
765+ name = sema_->SubstDeclarationNameInfo ({name, loc_}, mtal).getName ();
766+ }
767+
757768 clang::OverloadCandidateSet candidates (loc_, csk);
758769 switch (lookup.kind ) {
759770 case LookupKind::RegularName:
0 commit comments