@@ -3515,6 +3515,50 @@ class VarargExpansionExpr : public Expr {
35153515 }
35163516};
35173517
3518+ // / A pack element expression spelled with the contextual \c each
3519+ // / keyword applied to a pack reference expression.
3520+ // /
3521+ // / \code
3522+ // / func zip<T..., U...>(t: (each T)..., u: (each U)...) {
3523+ // / let zipped = (each t, each u)...
3524+ // / }
3525+ // / \endcode
3526+ // /
3527+ // / Pack elements can only appear in the pattern expression of a
3528+ // / \c PackExpansionExpr.
3529+ class PackElementExpr final : public Expr {
3530+ SourceLoc EachLoc;
3531+ Expr *PackRefExpr;
3532+
3533+ PackElementExpr (SourceLoc eachLoc, Expr *packRefExpr,
3534+ bool implicit = false , Type type = Type())
3535+ : Expr(ExprKind::PackElement, implicit, type),
3536+ EachLoc (eachLoc), PackRefExpr(packRefExpr) {}
3537+
3538+ public:
3539+ static PackElementExpr *create (ASTContext &ctx, SourceLoc eachLoc,
3540+ Expr *packRefExpr, bool implicit = false ,
3541+ Type type = Type());
3542+
3543+ Expr *getPackRefExpr () const { return PackRefExpr; }
3544+
3545+ void setPackRefExpr (Expr *packRefExpr) {
3546+ PackRefExpr = packRefExpr;
3547+ }
3548+
3549+ SourceLoc getStartLoc () const {
3550+ return EachLoc;
3551+ }
3552+
3553+ SourceLoc getEndLoc () const {
3554+ return PackRefExpr->getEndLoc ();
3555+ }
3556+
3557+ static bool classof (const Expr *E) {
3558+ return E->getKind () == ExprKind::PackElement;
3559+ }
3560+ };
3561+
35183562// / A pack expansion expression is a pattern expression followed by
35193563// / the expansion operator '...'. The pattern expression contains
35203564// / references to parameter packs of length N, and the expansion
@@ -3525,51 +3569,41 @@ class VarargExpansionExpr : public Expr {
35253569// / call argument lists, the elements of a tuple value, and the source
35263570// / of a for-in loop.
35273571class PackExpansionExpr final : public Expr,
3528- private llvm::TrailingObjects<PackExpansionExpr,
3529- OpaqueValueExpr *, Expr *> {
3572+ private llvm::TrailingObjects<PackExpansionExpr, PackElementExpr *> {
35303573 friend TrailingObjects;
35313574
35323575 Expr *PatternExpr;
35333576 SourceLoc DotsLoc;
35343577 GenericEnvironment *Environment;
35353578
35363579 PackExpansionExpr (Expr *patternExpr,
3537- ArrayRef<OpaqueValueExpr *> opaqueValues,
3538- ArrayRef<Expr *> bindings,
3580+ ArrayRef<PackElementExpr *> packElements,
35393581 SourceLoc dotsLoc,
35403582 GenericEnvironment *environment,
35413583 bool implicit, Type type)
35423584 : Expr(ExprKind::PackExpansion, implicit, type),
35433585 PatternExpr (patternExpr), DotsLoc(dotsLoc), Environment(environment) {
3544- assert (opaqueValues.size () == bindings.size ());
3545- Bits.PackExpansionExpr .NumBindings = opaqueValues.size ();
3586+ Bits.PackExpansionExpr .NumBindings = packElements.size ();
35463587
35473588 assert (Bits.PackExpansionExpr .NumBindings > 0 &&
35483589 " PackExpansionExpr must have pack references" );
35493590
3550- std::uninitialized_copy (opaqueValues.begin (), opaqueValues.end (),
3551- getTrailingObjects<OpaqueValueExpr *>());
3552- std::uninitialized_copy (bindings.begin (), bindings.end (),
3553- getTrailingObjects<Expr *>());
3554- }
3555-
3556- size_t numTrailingObjects (OverloadToken<OpaqueValueExpr *>) const {
3557- return getNumBindings ();
3591+ std::uninitialized_copy (packElements.begin (), packElements.end (),
3592+ getTrailingObjects<PackElementExpr *>());
35583593 }
35593594
3560- size_t numTrailingObjects (OverloadToken<Expr *>) const {
3595+ size_t numTrailingObjects (OverloadToken<PackElementExpr *>) const {
35613596 return getNumBindings ();
35623597 }
35633598
3564- MutableArrayRef<Expr *> getMutableBindings () {
3565- return {getTrailingObjects<Expr *>(), getNumBindings ()};
3599+ MutableArrayRef<PackElementExpr *> getMutableBindings () {
3600+ return {getTrailingObjects<PackElementExpr *>(), getNumBindings ()};
35663601 }
35673602
35683603public:
35693604 static PackExpansionExpr *create (ASTContext &ctx,
35703605 Expr *patternExpr,
3571- ArrayRef<OpaqueValueExpr *> opaqueValues,
3572- ArrayRef<Expr *> bindings,
3606+ ArrayRef<PackElementExpr *> packElements,
35733607 SourceLoc dotsLoc,
35743608 GenericEnvironment *environment,
35753609 bool implicit = false ,
@@ -3585,15 +3619,11 @@ class PackExpansionExpr final : public Expr,
35853619 return Bits.PackExpansionExpr .NumBindings ;
35863620 }
35873621
3588- ArrayRef<OpaqueValueExpr *> getOpaqueValues () {
3589- return {getTrailingObjects<OpaqueValueExpr *>(), getNumBindings ()};
3590- }
3591-
3592- ArrayRef<Expr *> getBindings () {
3593- return {getTrailingObjects<Expr *>(), getNumBindings ()};
3622+ ArrayRef<PackElementExpr *> getPackElements () {
3623+ return {getTrailingObjects<PackElementExpr *>(), getNumBindings ()};
35943624 }
35953625
3596- void setBinding (unsigned i, Expr *e) {
3626+ void setBinding (unsigned i, PackElementExpr *e) {
35973627 getMutableBindings ()[i] = e;
35983628 }
35993629
0 commit comments