================
@@ -4973,6 +4987,101 @@ TemplateName
TreeTransform<Derived>::TransformTemplateName(
S->getFinal());
}
+ if (PackIndexingTemplateStorage *PI = Name.getAsPackIndexingTemplate()) {
+ assert(!QualifierLoc && "Unexpected qualified pack-index-template-name");
+
+ ExprResult IndexExpr;
+ {
+ EnterExpressionEvaluationContext ConstantContext(
+ SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
+ IndexExpr = getDerived().TransformExpr(PI->getIndexExpr());
+ if (IndexExpr.isInvalid())
+ return TemplateName();
+ }
+
+ auto TransformOne = [&](TemplateName N) {
+ NestedNameSpecifierLoc NoQualifier;
+ return getDerived().TransformTemplateName(
+ NoQualifier, TemplateKWLoc, N, NameLoc, ObjectType,
+ FirstQualifierInScope, AllowInjectedClassName);
+ };
+
+ TemplateName Pattern = PI->getPattern();
+ SmallVector<TemplateName, 4> SubstitutedNames;
+ ArrayRef<TemplateName> Names = PI->getExpansions();
+
+ bool NotYetExpanded = Names.empty();
+ bool FullySubstituted = true;
+
+ if (Names.empty() && !PI->expandsToEmptyPack())
+ Names = ArrayRef(&Pattern, 1);
+
+ for (TemplateName N : Names) {
+ if (!N.containsUnexpandedParameterPack()) {
+ TemplateName Transformed = TransformOne(N);
+ if (Transformed.isNull())
+ return TemplateName();
+ SubstitutedNames.push_back(Transformed);
+ continue;
+ }
+
+ SmallVector<UnexpandedParameterPack, 2> Unexpanded;
+ getSema().collectUnexpandedParameterPacks(N, Unexpanded);
+ assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
+
+ bool ShouldExpand = true;
+ bool RetainExpansion = false;
+ UnsignedOrNone NumExpansions = std::nullopt;
+ if (getDerived().TryExpandParameterPacks(
+ NameLoc, SourceRange(), Unexpanded,
+ /*FailOnPackProducingTemplates=*/true, ShouldExpand,
+ RetainExpansion, NumExpansions))
+ return TemplateName();
+
+ if (!ShouldExpand) {
+ Sema::ArgPackSubstIndexRAII SubstIndex(getSema(), std::nullopt);
+ TemplateName Pack = TransformOne(N);
+ if (Pack.isNull())
+ return TemplateName();
+ if (NotYetExpanded) {
+ FullySubstituted = false;
+ return getDerived().RebuildPackIndexingTemplateName(
+ Pack, IndexExpr.get(), FullySubstituted);
+ }
+ SubstitutedNames.push_back(Pack);
+ continue;
+ }
+
+ for (unsigned I = 0; I != *NumExpansions; ++I) {
+ Sema::ArgPackSubstIndexRAII SubstIndex(getSema(), I);
+ TemplateName Out = TransformOne(N);
+ if (Out.isNull())
+ return TemplateName();
+ SubstitutedNames.push_back(Out);
+ FullySubstituted &= !Out.containsUnexpandedParameterPack();
+ }
+
+ // If we're supposed to retain a pack expansion, do so by temporarily
+ // forgetting the partially-substituted parameter pack.
+ if (RetainExpansion) {
+ FullySubstituted = false;
+ ForgetPartiallySubstitutedPackRAII Forget(getDerived());
+ TemplateName Out = TransformOne(N);
+ if (Out.isNull())
+ return TemplateName();
+ SubstitutedNames.push_back(Out);
+ }
----------------
cor3ntin wrote:
I think the only way you can get there is with aliases - I added something
https://github.com/llvm/llvm-project/pull/218738
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits