================
@@ -7167,6 +7173,43 @@
TreeTransform<Derived>::TransformPackIndexingType(TypeLocBuilder &TLB,
SubtitutedTypes.push_back(Pack);
continue;
}
+ // Fast path: substitute only the selected element instead of all N. A
+ // pack-indexing type inside a pack expansion (`T...[Is]...`) is
transformed
+ // once per outer element, so substituting the whole pack each time is
+ // O(N^2) in time and memory.
+ if (!RetainExpansion && Types.size() == 1 && IndexExpr.isUsable() &&
+ !IndexExpr.get()->isInstantiationDependent()) {
+ llvm::APSInt Value;
+ ExprResult CCE = SemaRef.CheckConvertedConstantExpression(
+ IndexExpr.get(), SemaRef.Context.getSizeType(), Value,
+ CCEKind::PackIndex);
+ if (!CCE.isUsable() || !Value.isRepresentableByInt64())
+ return QualType();
+ uint64_t V = Value.getZExtValue();
+ if (V < *NumExpansions) {
----------------
zyn0217 wrote:
Should we diagnose if V >= *NumExpansions or assert?
https://github.com/llvm/llvm-project/pull/213790
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits