@@ -3515,6 +3515,50 @@ class VarargExpansionExpr : public Expr {
3515
3515
}
3516
3516
};
3517
3517
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
+
3518
3562
// / A pack expansion expression is a pattern expression followed by
3519
3563
// / the expansion operator '...'. The pattern expression contains
3520
3564
// / references to parameter packs of length N, and the expansion
@@ -3525,51 +3569,41 @@ class VarargExpansionExpr : public Expr {
3525
3569
// / call argument lists, the elements of a tuple value, and the source
3526
3570
// / of a for-in loop.
3527
3571
class PackExpansionExpr final : public Expr,
3528
- private llvm::TrailingObjects<PackExpansionExpr,
3529
- OpaqueValueExpr *, Expr *> {
3572
+ private llvm::TrailingObjects<PackExpansionExpr, PackElementExpr *> {
3530
3573
friend TrailingObjects;
3531
3574
3532
3575
Expr *PatternExpr;
3533
3576
SourceLoc DotsLoc;
3534
3577
GenericEnvironment *Environment;
3535
3578
3536
3579
PackExpansionExpr (Expr *patternExpr,
3537
- ArrayRef<OpaqueValueExpr *> opaqueValues,
3538
- ArrayRef<Expr *> bindings,
3580
+ ArrayRef<PackElementExpr *> packElements,
3539
3581
SourceLoc dotsLoc,
3540
3582
GenericEnvironment *environment,
3541
3583
bool implicit, Type type)
3542
3584
: Expr(ExprKind::PackExpansion, implicit, type),
3543
3585
PatternExpr (patternExpr), DotsLoc(dotsLoc), Environment(environment) {
3544
- assert (opaqueValues.size () == bindings.size ());
3545
- Bits.PackExpansionExpr .NumBindings = opaqueValues.size ();
3586
+ Bits.PackExpansionExpr .NumBindings = packElements.size ();
3546
3587
3547
3588
assert (Bits.PackExpansionExpr .NumBindings > 0 &&
3548
3589
" PackExpansionExpr must have pack references" );
3549
3590
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 *>());
3558
3593
}
3559
3594
3560
- size_t numTrailingObjects (OverloadToken<Expr *>) const {
3595
+ size_t numTrailingObjects (OverloadToken<PackElementExpr *>) const {
3561
3596
return getNumBindings ();
3562
3597
}
3563
3598
3564
- MutableArrayRef<Expr *> getMutableBindings () {
3565
- return {getTrailingObjects<Expr *>(), getNumBindings ()};
3599
+ MutableArrayRef<PackElementExpr *> getMutableBindings () {
3600
+ return {getTrailingObjects<PackElementExpr *>(), getNumBindings ()};
3566
3601
}
3567
3602
3568
3603
public:
3569
3604
static PackExpansionExpr *create (ASTContext &ctx,
3570
3605
Expr *patternExpr,
3571
- ArrayRef<OpaqueValueExpr *> opaqueValues,
3572
- ArrayRef<Expr *> bindings,
3606
+ ArrayRef<PackElementExpr *> packElements,
3573
3607
SourceLoc dotsLoc,
3574
3608
GenericEnvironment *environment,
3575
3609
bool implicit = false ,
@@ -3585,15 +3619,11 @@ class PackExpansionExpr final : public Expr,
3585
3619
return Bits.PackExpansionExpr .NumBindings ;
3586
3620
}
3587
3621
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 ()};
3594
3624
}
3595
3625
3596
- void setBinding (unsigned i, Expr *e) {
3626
+ void setBinding (unsigned i, PackElementExpr *e) {
3597
3627
getMutableBindings ()[i] = e;
3598
3628
}
3599
3629
0 commit comments