Skip to content

Commit 7f43001

Browse files
committed
[AST] Store opaque value bindings in PackExpansionExpr.
1 parent cd1d1f8 commit 7f43001

File tree

2 files changed

+63
-4
lines changed

2 files changed

+63
-4
lines changed

include/swift/AST/Expr.h

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,11 @@ class alignas(8) Expr : public ASTAllocated<Expr> {
350350
IsObjC : 1
351351
);
352352

353+
SWIFT_INLINE_BITFIELD_FULL(PackExpansionExpr, Expr, 32,
354+
: NumPadBits,
355+
NumBindings : 32
356+
);
357+
353358
SWIFT_INLINE_BITFIELD_FULL(SequenceExpr, Expr, 32,
354359
: NumPadBits,
355360
NumElements : 32
@@ -3519,19 +3524,50 @@ class VarargExpansionExpr : public Expr {
35193524
/// that naturally accept a comma-separated list of values, including
35203525
/// call argument lists, the elements of a tuple value, and the source
35213526
/// 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+
35233532
Expr *PatternExpr;
35243533
SourceLoc DotsLoc;
35253534

35263535
PackExpansionExpr(Expr *patternExpr,
3536+
ArrayRef<OpaqueValueExpr *> opaqueValues,
3537+
ArrayRef<Expr *> bindings,
35273538
SourceLoc dotsLoc,
35283539
bool implicit, Type type)
35293540
: 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+
}
35313565

35323566
public:
35333567
static PackExpansionExpr *create(ASTContext &ctx,
35343568
Expr *patternExpr,
3569+
ArrayRef<OpaqueValueExpr *> opaqueValues,
3570+
ArrayRef<Expr *> bindings,
35353571
SourceLoc dotsLoc,
35363572
bool implicit = false,
35373573
Type type = Type());
@@ -3542,6 +3578,22 @@ class PackExpansionExpr: public Expr {
35423578
PatternExpr = patternExpr;
35433579
}
35443580

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+
35453597
SourceLoc getStartLoc() const {
35463598
return PatternExpr->getStartLoc();
35473599
}

lib/AST/Expr.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,10 +1239,17 @@ VarargExpansionExpr *VarargExpansionExpr::createArrayExpansion(ASTContext &ctx,
12391239

12401240
PackExpansionExpr *
12411241
PackExpansionExpr::create(ASTContext &ctx, Expr *patternExpr,
1242+
ArrayRef<OpaqueValueExpr *> opaqueValues,
1243+
ArrayRef<Expr *> bindings,
12421244
SourceLoc dotsLoc, bool implicit,
12431245
Type type) {
1244-
return new (ctx) PackExpansionExpr(patternExpr, dotsLoc,
1245-
implicit, type);
1246+
size_t size =
1247+
totalSizeToAlloc<OpaqueValueExpr *, Expr *>(opaqueValues.size(),
1248+
bindings.size());
1249+
void *mem = ctx.Allocate(size, alignof(PackExpansionExpr));
1250+
return ::new (mem) PackExpansionExpr(patternExpr, opaqueValues,
1251+
bindings, dotsLoc,
1252+
implicit, type);
12461253
}
12471254

12481255
SequenceExpr *SequenceExpr::create(ASTContext &ctx, ArrayRef<Expr*> elements) {

0 commit comments

Comments
 (0)