@@ -3063,6 +3063,50 @@ namespace {
30633063 return variadicSeq;
30643064 }
30653065
3066+ void collectExpandedPacks (PackExpansionExpr *expansion,
3067+ SmallVectorImpl<ASTNode> &packs) {
3068+ struct PackCollector : public ASTWalker {
3069+ private:
3070+ SmallVectorImpl<ASTNode> &Packs;
3071+
3072+ public:
3073+ PackCollector (SmallVectorImpl<ASTNode> &packs) : Packs(packs) {}
3074+
3075+ // / Walk everything that's available.
3076+ MacroWalking getMacroWalkingBehavior () const override {
3077+ return MacroWalking::ArgumentsAndExpansion;
3078+ }
3079+
3080+ virtual PreWalkResult<Expr *> walkToExprPre (Expr *E) override {
3081+ // Don't walk into nested pack expansions
3082+ if (isa<PackExpansionExpr>(E)) {
3083+ return Action::SkipChildren (E);
3084+ }
3085+
3086+ if (isa<PackElementExpr>(E)) {
3087+ Packs.push_back (E);
3088+ }
3089+
3090+ return Action::Continue (E);
3091+ }
3092+
3093+ virtual PreWalkAction walkToTypeReprPre (TypeRepr *T) override {
3094+ // Don't walk into nested pack expansions
3095+ if (isa<PackExpansionTypeRepr>(T)) {
3096+ return Action::SkipChildren ();
3097+ }
3098+
3099+ if (isa<PackElementTypeRepr>(T)) {
3100+ Packs.push_back (T);
3101+ }
3102+
3103+ return Action::Continue ();
3104+ }
3105+ } packCollector (packs);
3106+
3107+ expansion->getPatternExpr ()->walk (packCollector);
3108+ }
3109+
30663110 Type visitPackExpansionExpr (PackExpansionExpr *expr) {
30673111 assert (PackElementEnvironments.back () == expr);
30683112 PackElementEnvironments.pop_back ();
@@ -3086,7 +3130,7 @@ namespace {
30863130 // Generate ShapeOf constraints between all packs expanded by this
30873131 // pack expansion expression through the shape type variable.
30883132 SmallVector<ASTNode, 2 > expandedPacks;
3089- expr-> getExpandedPacks ( expandedPacks);
3133+ collectExpandedPacks (expr, expandedPacks);
30903134
30913135 if (expandedPacks.empty ()) {
30923136 (void )CS.recordFix (AllowValueExpansionWithoutPackReferences::create (
0 commit comments