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

Reply via email to