================
@@ -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

Reply via email to