Skip to content

Commit e4bd7f7

Browse files
committed
[region-isolation] Track the full isolation crossing when emitting transfer non transferrable error.
Preparing for beginning to emit named errors where I need this information. This just lets me do it before that other commit to make it cleaner. NFC.
1 parent 7fe100a commit e4bd7f7

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

lib/SILOptimizer/Mandatory/TransferNonSendable.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -950,31 +950,30 @@ class TransferNonTransferrableDiagnosticInferrer {
950950

951951
struct UseDiagnosticInfo {
952952
UseDiagnosticInfoKind kind;
953-
std::optional<ActorIsolation> transferredIsolation;
953+
std::optional<ApplyIsolationCrossing> transferredIsolationCrossing = {};
954954

955955
static UseDiagnosticInfo forMiscUse() {
956-
return {UseDiagnosticInfoKind::MiscUse, {}};
956+
return {UseDiagnosticInfoKind::MiscUse};
957957
}
958958

959959
static UseDiagnosticInfo
960-
forFunctionArgumentApply(ActorIsolation isolation) {
960+
forFunctionArgumentApply(ApplyIsolationCrossing isolation) {
961961
return {UseDiagnosticInfoKind::FunctionArgumentApply, isolation};
962962
}
963963

964964
static UseDiagnosticInfo
965-
forFunctionArgumentClosure(ActorIsolation isolation) {
965+
forFunctionArgumentClosure(ApplyIsolationCrossing isolation) {
966966
return {UseDiagnosticInfoKind::FunctionArgumentClosure, isolation};
967967
}
968968

969969
static UseDiagnosticInfo forFunctionArgumentApplyStronglyTransferred() {
970-
return {UseDiagnosticInfoKind::FunctionArgumentApplyStronglyTransferred,
971-
{}};
970+
return {UseDiagnosticInfoKind::FunctionArgumentApplyStronglyTransferred};
972971
}
973972

974973
private:
975974
UseDiagnosticInfo(UseDiagnosticInfoKind kind,
976-
std::optional<ActorIsolation> isolation)
977-
: kind(kind), transferredIsolation(isolation) {}
975+
std::optional<ApplyIsolationCrossing> isolation = {})
976+
: kind(kind), transferredIsolationCrossing(isolation) {}
978977
};
979978

980979
private:
@@ -1015,8 +1014,8 @@ bool TransferNonTransferrableDiagnosticInferrer::initForIsolatedPartialApply(
10151014
for (auto &p : foundCapturedIsolationCrossing) {
10161015
if (std::get<1>(p) == opIndex) {
10171016
loc = std::get<0>(p).getLoc();
1018-
diagnosticInfo = UseDiagnosticInfo::forFunctionArgumentClosure(
1019-
std::get<2>(p).getCalleeIsolation());
1017+
diagnosticInfo =
1018+
UseDiagnosticInfo::forFunctionArgumentClosure(std::get<2>(p));
10201019
return true;
10211020
}
10221021
}
@@ -1034,11 +1033,11 @@ bool TransferNonTransferrableDiagnosticInferrer::run() {
10341033
auto loc = info.transferredOperand->getUser()->getLoc();
10351034

10361035
if (auto *sourceApply = loc.getAsASTNode<ApplyExpr>()) {
1037-
std::optional<ActorIsolation> isolation = {};
1036+
std::optional<ApplyIsolationCrossing> isolation = {};
10381037

10391038
// First try to get the apply from the isolation crossing.
10401039
if (auto value = sourceApply->getIsolationCrossing())
1041-
isolation = value->getCalleeIsolation();
1040+
isolation = value;
10421041

10431042
// If we could not infer an isolation...
10441043
if (!isolation) {
@@ -1105,7 +1104,8 @@ void TransferNonSendableImpl::emitTransferredNonTransferrableDiagnostics() {
11051104
case UseDiagnosticInfoKind::FunctionArgumentApply: {
11061105
diagnoseError(astContext, loc, diag::regionbasedisolation_arg_transferred,
11071106
op->get()->getType().getASTType(),
1108-
diagnosticInfo.transferredIsolation.value())
1107+
diagnosticInfo.transferredIsolationCrossing.value()
1108+
.getCalleeIsolation())
11091109
.highlight(op->getUser()->getLoc().getSourceRange());
11101110
// Only emit the note if our value is different from the function
11111111
// argument.
@@ -1124,7 +1124,8 @@ void TransferNonSendableImpl::emitTransferredNonTransferrableDiagnostics() {
11241124
case UseDiagnosticInfoKind::FunctionArgumentClosure: {
11251125
diagnoseError(astContext, loc, diag::regionbasedisolation_arg_transferred,
11261126
op->get()->getType().getASTType(),
1127-
diagnosticInfo.transferredIsolation.value())
1127+
diagnosticInfo.transferredIsolationCrossing.value()
1128+
.getCalleeIsolation())
11281129
.highlight(op->getUser()->getLoc().getSourceRange());
11291130
// Only emit the note if our value is different from the function
11301131
// argument.

0 commit comments

Comments
 (0)