================ @@ -5054,95 +5089,128 @@ bool TreeTransform<Derived>::TransformTemplateArguments( } if (In.getArgument().isPackExpansion()) { - // We have a pack expansion, for which we will be substituting into - // the pattern. - SourceLocation Ellipsis; - UnsignedOrNone OrigNumExpansions = std::nullopt; - TemplateArgumentLoc Pattern - = getSema().getTemplateArgumentPackExpansionPattern( - In, Ellipsis, OrigNumExpansions); - - SmallVector<UnexpandedParameterPack, 2> Unexpanded; - getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); - assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); - - // Determine whether the set of unexpanded parameter packs can and should - // be expanded. - bool Expand = true; - bool RetainExpansion = false; - UnsignedOrNone NumExpansions = OrigNumExpansions; - if (getDerived().TryExpandParameterPacks(Ellipsis, - Pattern.getSourceRange(), - Unexpanded, - Expand, - RetainExpansion, - NumExpansions)) + if (ExpandTemplateArgument(In, Outputs, Uneval, true)) return true; + continue; + } - if (!Expand) { - // The transform has determined that we should perform a simple - // transformation on the pack expansion, producing another pack - // expansion. - TemplateArgumentLoc OutPattern; - Sema::ArgPackSubstIndexRAII SubstIndex(getSema(), std::nullopt); - if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) - return true; + // The simple case: + if (getDerived().TransformTemplateArgument(In, Out, Uneval)) + return true; - Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, - NumExpansions); - if (Out.getArgument().isNull()) - return true; + Outputs.addArgument(Out); + } - Outputs.addArgument(Out); - continue; - } + return false; +} - // The transform has determined that we should perform an elementwise - // expansion of the pattern. Do so. - for (unsigned I = 0; I != *NumExpansions; ++I) { - Sema::ArgPackSubstIndexRAII SubstIndex(getSema(), I); +template <typename Derived> +bool TreeTransform<Derived>::ExpandTemplateArgument( + TemplateArgumentLoc In, TemplateArgumentListInfo &Outputs, bool Uneval, + bool TryExpandingSubstPacks) { + assert(In.getArgument().isPackExpansion()); + // We have a pack expansion, for which we will be substituting into the + // pattern. + SourceLocation Ellipsis; + UnsignedOrNone OrigNumExpansions = std::nullopt; + TemplateArgumentLoc Pattern = + getSema().getTemplateArgumentPackExpansionPattern(In, Ellipsis, + OrigNumExpansions); - if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) - return true; + SmallVector<UnexpandedParameterPack, 2> Unexpanded; + getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); + if (!TryExpandingSubstPacks) { + // Only do something if there is an opportunity for late expansion. + bool SawPackTypes = llvm::any_of(Unexpanded, [](UnexpandedParameterPack P) { + return P.first.dyn_cast<const SubstBuiltinTemplatePackType *>(); + }); + if (!SawPackTypes) { + Outputs.addArgument(In); + return false; + } ---------------- zyn0217 wrote:
I added an assert to line 5128 and nothing fired with the test. Probably dead code? https://github.com/llvm/llvm-project/pull/106730 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits