Skip to content

Commit 4debaf2

Browse files
committed
[AST] Introduce a new conversion expression - ActorIsolationErasure
To be used in situations when a global actor isolation is stripped from a function type in argument positions and could be extended in the future to cover more if needed.
1 parent 182ba1b commit 4debaf2

File tree

6 files changed

+39
-1
lines changed

6 files changed

+39
-1
lines changed

include/swift/AST/Expr.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3519,6 +3519,19 @@ class BridgeToObjCExpr : public ImplicitConversionExpr {
35193519
}
35203520
};
35213521

3522+
/// ActorIsolationErasureExpr - A special kind of function conversion that
3523+
/// drops actor isolation.
3524+
class ActorIsolationErasureExpr : public ImplicitConversionExpr {
3525+
public:
3526+
ActorIsolationErasureExpr(Expr *subExpr, Type type)
3527+
: ImplicitConversionExpr(ExprKind::ActorIsolationErasure, subExpr, type) {
3528+
}
3529+
3530+
static bool classof(const Expr *E) {
3531+
return E->getKind() == ExprKind::ActorIsolationErasure;
3532+
}
3533+
};
3534+
35223535
/// UnresolvedSpecializeExpr - Represents an explicit specialization using
35233536
/// a type parameter list (e.g. "Vector<Int>") that has not been resolved.
35243537
class UnresolvedSpecializeExpr final : public Expr,

include/swift/AST/ExprNodes.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ ABSTRACT_EXPR(ImplicitConversion, Expr)
189189
EXPR(DifferentiableFunctionExtractOriginal, ImplicitConversionExpr)
190190
EXPR(LinearFunctionExtractOriginal, ImplicitConversionExpr)
191191
EXPR(LinearToDifferentiableFunction, ImplicitConversionExpr)
192-
EXPR_RANGE(ImplicitConversion, Load, LinearToDifferentiableFunction)
192+
EXPR(ActorIsolationErasure, ImplicitConversionExpr)
193+
EXPR_RANGE(ImplicitConversion, Load, ActorIsolationErasure)
193194
ABSTRACT_EXPR(ExplicitCast, Expr)
194195
ABSTRACT_EXPR(CheckedCast, ExplicitCastExpr)
195196
EXPR(ForcedCheckedCast, CheckedCastExpr)

lib/AST/ASTDumper.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2695,6 +2695,13 @@ class PrintExpr : public ExprVisitor<PrintExpr, void, StringRef>,
26952695
printFoot();
26962696
}
26972697

2698+
void visitActorIsolationErasureExpr(ActorIsolationErasureExpr *E,
2699+
StringRef label) {
2700+
printCommon(E, "actor_isolation_erasure_expr", label);
2701+
printRec(E->getSubExpr());
2702+
printFoot();
2703+
}
2704+
26982705
void visitInOutExpr(InOutExpr *E, StringRef label) {
26992706
printCommon(E, "inout_expr", label);
27002707
printRec(E->getSubExpr());

lib/AST/ASTPrinter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5924,6 +5924,9 @@ void PrintAST::visitLinearFunctionExtractOriginalExpr(swift::LinearFunctionExtra
59245924
void PrintAST::visitLinearToDifferentiableFunctionExpr(swift::LinearToDifferentiableFunctionExpr *expr) {
59255925
}
59265926

5927+
void PrintAST::visitActorIsolationErasureExpr(ActorIsolationErasureExpr *expr) {
5928+
}
5929+
59275930
void PrintAST::visitPropertyWrapperValuePlaceholderExpr(swift::PropertyWrapperValuePlaceholderExpr *expr) {
59285931
}
59295932

lib/AST/Expr.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ ConcreteDeclRef Expr::getReferencedDecl(bool stopAtParenExpr) const {
456456
PASS_THROUGH_REFERENCE(ConditionalBridgeFromObjC, getSubExpr);
457457
PASS_THROUGH_REFERENCE(UnderlyingToOpaque, getSubExpr);
458458
PASS_THROUGH_REFERENCE(Unreachable, getSubExpr);
459+
PASS_THROUGH_REFERENCE(ActorIsolationErasure, getSubExpr);
459460
NO_REFERENCE(Coerce);
460461
NO_REFERENCE(ForcedCheckedCast);
461462
NO_REFERENCE(ConditionalCheckedCast);
@@ -822,6 +823,7 @@ bool Expr::canAppendPostfixExpression(bool appendingPostfixOperator) const {
822823
case ExprKind::BridgeToObjC:
823824
case ExprKind::UnderlyingToOpaque:
824825
case ExprKind::Unreachable:
826+
case ExprKind::ActorIsolationErasure:
825827
// Implicit conversion nodes have no syntax of their own; defer to the
826828
// subexpression.
827829
return cast<ImplicitConversionExpr>(this)->getSubExpr()
@@ -1029,6 +1031,7 @@ bool Expr::isValidParentOfTypeExpr(Expr *typeExpr) const {
10291031
case ExprKind::TypeJoin:
10301032
case ExprKind::MacroExpansion:
10311033
case ExprKind::CurrentContextIsolation:
1034+
case ExprKind::ActorIsolationErasure:
10321035
return false;
10331036
}
10341037

@@ -1562,6 +1565,10 @@ static ValueDecl *getCalledValue(Expr *E, bool skipFunctionConversions) {
15621565
if (skipFunctionConversions) {
15631566
if (auto fnConv = dyn_cast<FunctionConversionExpr>(E))
15641567
return getCalledValue(fnConv->getSubExpr(), skipFunctionConversions);
1568+
1569+
if (auto *actorErasure = dyn_cast<ActorIsolationErasureExpr>(E))
1570+
return getCalledValue(actorErasure->getSubExpr(),
1571+
skipFunctionConversions);
15651572
}
15661573

15671574
Expr *E2 = E->getValueProvidingExpr();

lib/SILGen/SILGenExpr.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,8 @@ namespace {
484484
}
485485
RValue visitFunctionConversionExpr(FunctionConversionExpr *E,
486486
SGFContext C);
487+
RValue visitActorIsolationErasureExpr(ActorIsolationErasureExpr *E,
488+
SGFContext C);
487489
RValue visitCovariantFunctionConversionExpr(
488490
CovariantFunctionConversionExpr *E,
489491
SGFContext C);
@@ -2115,6 +2117,11 @@ RValue RValueEmitter::visitCovariantReturnConversionExpr(
21152117
return RValue(SGF, e, result);
21162118
}
21172119

2120+
RValue RValueEmitter::visitActorIsolationErasureExpr(ActorIsolationErasureExpr *E,
2121+
SGFContext C) {
2122+
llvm_unreachable("not implemented");
2123+
}
2124+
21182125
RValue RValueEmitter::visitErasureExpr(ErasureExpr *E, SGFContext C) {
21192126
if (auto result = tryEmitAsBridgingConversion(SGF, E, false, C)) {
21202127
return RValue(SGF, E, *result);

0 commit comments

Comments
 (0)