================
@@ -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) {
----------------
AnonMiraj wrote:
I tried diagnosing here before and it caused problems (it broke GH116105 in
[cxx2c-pack-indexing.cpp](
https://github.com/llvm/llvm-project/blob/b6676fc0b946947fea23240dee2187ec619f7669/clang/test/SemaCXX/cxx2c-pack-indexing.cpp#L278))
Since the full size of the expansions isn't known yet at this point, so I let
Sema::BuildPackIndexingType handle any out-of-bounds instead.
https://github.com/llvm/llvm-project/pull/213790
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits