Skip to content

Commit 37bae7a

Browse files
committed
[region-isolation] Use the sugared AST type when emitting a TransferNonTransferrable error for passing an argument as a transferrig parameter.
1 parent a703f22 commit 37bae7a

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

lib/SILOptimizer/Mandatory/TransferNonSendable.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,8 +1042,9 @@ class TransferNonTransferrableDiagnosticInferrer {
10421042
return {UseDiagnosticInfoKind::FunctionArgumentClosure, isolation};
10431043
}
10441044

1045-
static UseDiagnosticInfo forFunctionArgumentApplyStronglyTransferred() {
1046-
return {UseDiagnosticInfoKind::FunctionArgumentApplyStronglyTransferred};
1045+
static UseDiagnosticInfo forFunctionArgumentApplyStronglyTransferred(Type inferredType) {
1046+
return {UseDiagnosticInfoKind::FunctionArgumentApplyStronglyTransferred, {},
1047+
inferredType};
10471048
}
10481049

10491050
static UseDiagnosticInfo
@@ -1155,8 +1156,14 @@ bool TransferNonTransferrableDiagnosticInferrer::run() {
11551156
if (auto fas = FullApplySite::isa(op->getUser())) {
11561157
if (fas.getArgumentParameterInfo(*op).hasOption(
11571158
SILParameterInfo::Transferring)) {
1159+
Type type = op->get()->getType().getASTType();
1160+
if (auto *inferredArgExpr =
1161+
inferArgumentExprFromApplyExpr(sourceApply, fas, op)) {
1162+
type = inferredArgExpr->findOriginalType();
1163+
}
1164+
11581165
diagnosticInfo =
1159-
UseDiagnosticInfo::forFunctionArgumentApplyStronglyTransferred();
1166+
UseDiagnosticInfo::forFunctionArgumentApplyStronglyTransferred(type);
11601167
return true;
11611168
}
11621169
}
@@ -1283,7 +1290,7 @@ void TransferNonSendableImpl::emitTransferredNonTransferrableDiagnostics() {
12831290
diagnoseError(
12841291
astContext, loc,
12851292
diag::regionbasedisolation_arg_passed_to_strongly_transferred_param,
1286-
op->get()->getType().getASTType())
1293+
diagnosticInfo.getType())
12871294
.highlight(op->getUser()->getLoc().getSourceRange());
12881295
break;
12891296
}

test/Concurrency/transfernonsendable_strong_transferring_params.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,3 +346,9 @@ func testTransferOtherParamClassStructTuple(_ x: transferring Klass, y: KlassWit
346346
x = y.ns2.1.second // expected-warning {{assigning 'y.ns2.1.second' to transferring parameter 'x' may cause a race}}
347347
// expected-note @-1 {{'y.ns2.1.second' is a task isolated value that is assigned into transferring parameter 'x'. Transferred uses of 'x' may race with caller uses of 'y.ns2.1.second'}}
348348
}
349+
350+
func useSugaredTypeNameWhenEmittingTaskIsolationError(_ x: @escaping @MainActor () async -> ()) {
351+
func fakeInit(operation: transferring @escaping () async -> ()) {}
352+
353+
fakeInit(operation: x) // expected-warning {{task isolated value of type '@MainActor () async -> ()' passed as a strongly transferred parameter}}
354+
}

0 commit comments

Comments
 (0)