@@ -350,6 +350,11 @@ class alignas(8) Expr : public ASTAllocated<Expr> {
350
350
IsObjC : 1
351
351
);
352
352
353
+ SWIFT_INLINE_BITFIELD_FULL (PackExpansionExpr, Expr, 32 ,
354
+ : NumPadBits,
355
+ NumBindings : 32
356
+ );
357
+
353
358
SWIFT_INLINE_BITFIELD_FULL (SequenceExpr, Expr, 32 ,
354
359
: NumPadBits,
355
360
NumElements : 32
@@ -3519,19 +3524,50 @@ class VarargExpansionExpr : public Expr {
3519
3524
// / that naturally accept a comma-separated list of values, including
3520
3525
// / call argument lists, the elements of a tuple value, and the source
3521
3526
// / of a for-in loop.
3522
- class PackExpansionExpr : public Expr {
3527
+ class PackExpansionExpr final : public Expr,
3528
+ private llvm::TrailingObjects<PackExpansionExpr,
3529
+ OpaqueValueExpr *, Expr *> {
3530
+ friend TrailingObjects;
3531
+
3523
3532
Expr *PatternExpr;
3524
3533
SourceLoc DotsLoc;
3525
3534
3526
3535
PackExpansionExpr (Expr *patternExpr,
3536
+ ArrayRef<OpaqueValueExpr *> opaqueValues,
3537
+ ArrayRef<Expr *> bindings,
3527
3538
SourceLoc dotsLoc,
3528
3539
bool implicit, Type type)
3529
3540
: Expr(ExprKind::PackExpansion, implicit, type),
3530
- PatternExpr (patternExpr), DotsLoc(dotsLoc) {}
3541
+ PatternExpr (patternExpr), DotsLoc(dotsLoc) {
3542
+ assert (opaqueValues.size () == bindings.size ());
3543
+ Bits.PackExpansionExpr .NumBindings = opaqueValues.size ();
3544
+
3545
+ assert (Bits.PackExpansionExpr .NumBindings > 0 &&
3546
+ " PackExpansionExpr must have pack references" );
3547
+
3548
+ std::uninitialized_copy (opaqueValues.begin (), opaqueValues.end (),
3549
+ getTrailingObjects<OpaqueValueExpr *>());
3550
+ std::uninitialized_copy (bindings.begin (), bindings.end (),
3551
+ getTrailingObjects<Expr *>());
3552
+ }
3553
+
3554
+ size_t numTrailingObjects (OverloadToken<OpaqueValueExpr *>) const {
3555
+ return getNumBindings ();
3556
+ }
3557
+
3558
+ size_t numTrailingObjects (OverloadToken<Expr *>) const {
3559
+ return getNumBindings ();
3560
+ }
3561
+
3562
+ MutableArrayRef<Expr *> getMutableBindings () {
3563
+ return {getTrailingObjects<Expr *>(), getNumBindings ()};
3564
+ }
3531
3565
3532
3566
public:
3533
3567
static PackExpansionExpr *create (ASTContext &ctx,
3534
3568
Expr *patternExpr,
3569
+ ArrayRef<OpaqueValueExpr *> opaqueValues,
3570
+ ArrayRef<Expr *> bindings,
3535
3571
SourceLoc dotsLoc,
3536
3572
bool implicit = false ,
3537
3573
Type type = Type());
@@ -3542,6 +3578,22 @@ class PackExpansionExpr: public Expr {
3542
3578
PatternExpr = patternExpr;
3543
3579
}
3544
3580
3581
+ unsigned getNumBindings () const {
3582
+ return Bits.PackExpansionExpr .NumBindings ;
3583
+ }
3584
+
3585
+ ArrayRef<OpaqueValueExpr *> getOpaqueValues () {
3586
+ return {getTrailingObjects<OpaqueValueExpr *>(), getNumBindings ()};
3587
+ }
3588
+
3589
+ ArrayRef<Expr *> getBindings () {
3590
+ return {getTrailingObjects<Expr *>(), getNumBindings ()};
3591
+ }
3592
+
3593
+ void setBinding (unsigned i, Expr *e) {
3594
+ getMutableBindings ()[i] = e;
3595
+ }
3596
+
3545
3597
SourceLoc getStartLoc () const {
3546
3598
return PatternExpr->getStartLoc ();
3547
3599
}
0 commit comments