mizvekov added inline comments.
================ Comment at: clang/lib/Sema/SemaTemplateInstantiate.cpp:1872 QualType Result = getSema().Context.getTemplateTypeParmType( - T->getDepth() - TemplateArgs.getNumSubstitutedLevels(), T->getIndex(), - T->isParameterPack(), NewTTPDecl); + getNewDepth(T->getDepth()), T->getIndex(), T->isParameterPack(), + NewTTPDecl); ---------------- mizvekov wrote: > mizvekov wrote: > > rsmith wrote: > > > mizvekov wrote: > > > > mark > > > Instead of adding the new `EarlySubstitution` flag and wiring it through > > > everywhere, can you use the existing > > > `MultiLevelTemplateArgumentList::getNewDepth` function? That already > > > handles the case of a depth that's within the number of retained outer > > > levels. We might need to set the number of retained outer levels properly > > > when doing alias template substitution; I'm not sure if we do so > > > currently and I suspect we don't. > > I think we do set the number of outer levels correctly when substituting > > within the type of alias templates, circa SemaTemplate.cpp:3718: > > ``` > > // Only substitute for the innermost template argument list. > > MultiLevelTemplateArgumentList TemplateArgLists; > > TemplateArgLists.addOuterTemplateArguments(&StackTemplateArgs); > > TemplateArgLists.addOuterRetainedLevels( > > AliasTemplate->getTemplateParameters()->getDepth()); > > ``` > > > > What the flag was done to deal with is what happens in > > `TemplateDeclInstantiator::VisitTypeAliasTemplateDecl`, when replacing just > > the inner level. We need to substitute there without changing any depths, > > including the template parameters of the alias itself, and I could not find > > a way to do that without extending it with the new flag. > > > > Anyway, I will think about this again. > > I ended up finding another test case which this patch only partially helps, > > so I have been back investigating this problem again: > > https://godbolt.org/z/9fGb1KKvq > > ``` > > template <typename... As> struct Y; > > template <typename ...Bs> using Z = Y<Bs...>; > > template <typename ...Cs> struct foo { > > template <typename ...Ds> using bind = Z<Ds..., Cs...>; > > }; > > using U = foo<int>::bind<char>; > > ``` > Though that last test case seems actually to be a wrong index problem, not > wrong depth. That last new test case hits an unrelated problem besides this one, so I will deal with it in a separate patch. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D127351/new/ https://reviews.llvm.org/D127351 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits