Skip to content

Commit a933c14

Browse files
committed
[region-isolation] Only print the type of region that a value is in if it is not disconnected.
Just another diagnostic tweak.
1 parent 0b76110 commit a933c14

13 files changed

+225
-197
lines changed

include/swift/AST/DiagnosticsSIL.def

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -983,29 +983,29 @@ ERROR(regionbasedisolation_named_transfer_yields_race, none,
983983
(Identifier))
984984

985985
NOTE(regionbasedisolation_named_info_transfer_yields_race, none,
986-
"sending %1 %0 to %2 callee risks causing data races between %2 and local %3 uses",
986+
"sending %1%0 to %2 callee risks causing data races between %2 and local %3 uses",
987987
(Identifier, StringRef, ActorIsolation, ActorIsolation))
988988
NOTE(regionbasedisolation_named_info_transfer_yields_race_callee, none,
989-
"sending %1 %0 to %2 %3 %4 risks causing data races between %2 and local %5 uses",
989+
"sending %1%0 to %2 %3 %4 risks causing data races between %2 and local %5 uses",
990990
(Identifier, StringRef, ActorIsolation, DescriptiveDeclKind, DeclName, ActorIsolation))
991991

992992
NOTE(regionbasedisolation_named_transfer_non_transferrable, none,
993-
"sending %1 %0 to %2 callee risks causing data races between %2 and %1 uses",
994-
(Identifier, StringRef, ActorIsolation))
993+
"sending %1%0 to %2 callee risks causing data races between %2 and %3 uses",
994+
(Identifier, StringRef, ActorIsolation, StringRef))
995995
NOTE(regionbasedisolation_named_transfer_non_transferrable_callee, none,
996-
"sending %1 %0 to %2 %3 %4 risks causing data races between %2 and %1 uses",
997-
(Identifier, StringRef, ActorIsolation, DescriptiveDeclKind, DeclName))
996+
"sending %1%0 to %2 %3 %4 risks causing data races between %2 and %5 uses",
997+
(Identifier, StringRef, ActorIsolation, DescriptiveDeclKind, DeclName, StringRef))
998998
NOTE(regionbasedisolation_named_transfer_into_transferring_param, none,
999-
"%0 %1 is passed as a transferring parameter; Uses in callee may race with later %0 uses",
999+
"%0%1 is passed as a transferring parameter; Uses in callee may race with later %0uses",
10001000
(StringRef, Identifier))
10011001
NOTE(regionbasedisolation_named_notransfer_transfer_into_result, none,
1002-
"%0 %1 cannot be a transferring result. %0 uses may race with caller uses",
1003-
(StringRef, Identifier))
1002+
"%0%1 cannot be a transferring result. %2 uses may race with caller uses",
1003+
(StringRef, Identifier, StringRef))
10041004
NOTE(regionbasedisolation_named_stronglytransferred_binding, none,
10051005
"%0 used after being passed as a transferring parameter; Later uses could race",
10061006
(Identifier))
10071007
NOTE(regionbasedisolation_named_isolated_closure_yields_race, none,
1008-
"%0 %1 is captured by a %2 closure. %2 uses in closure may race against later %3 uses",
1008+
"%0%1 is captured by a %2 closure. %2 uses in closure may race against later %3 uses",
10091009
(StringRef, Identifier, ActorIsolation, ActorIsolation))
10101010

10111011
// Misc Error.

lib/SILOptimizer/Mandatory/TransferNonSendable.cpp

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -537,8 +537,11 @@ class UseAfterTransferDiagnosticEmitter {
537537
// Then emit the note with greater context.
538538
SmallString<64> descriptiveKindStr;
539539
{
540-
llvm::raw_svector_ostream os(descriptiveKindStr);
541-
namedValuesIsolationInfo.printForDiagnostics(os);
540+
if (!namedValuesIsolationInfo.isDisconnected()) {
541+
llvm::raw_svector_ostream os(descriptiveKindStr);
542+
namedValuesIsolationInfo.printForDiagnostics(os);
543+
os << ' ';
544+
}
542545
}
543546

544547
if (auto calleeInfo = getTransferringCalleeInfo()) {
@@ -619,8 +622,11 @@ class UseAfterTransferDiagnosticEmitter {
619622

620623
SmallString<64> descriptiveKindStr;
621624
{
622-
llvm::raw_svector_ostream os(descriptiveKindStr);
623-
namedValuesIsolationInfo.printForDiagnostics(os);
625+
if (!namedValuesIsolationInfo.isDisconnected()) {
626+
llvm::raw_svector_ostream os(descriptiveKindStr);
627+
namedValuesIsolationInfo.printForDiagnostics(os);
628+
os << ' ';
629+
}
624630
}
625631

626632
diagnoseNote(
@@ -1081,8 +1087,7 @@ class TransferNonTransferrableDiagnosticEmitter {
10811087
getIsolationRegionInfo().printForDiagnostics(os);
10821088
}
10831089
diagnoseError(loc, diag::regionbasedisolation_arg_transferred,
1084-
StringRef(descriptiveKindStr), type,
1085-
crossing.getCalleeIsolation())
1090+
descriptiveKindStr, type, crossing.getCalleeIsolation())
10861091
.highlight(getOperand()->getUser()->getLoc().getSourceRange())
10871092
.limitBehaviorIf(getBehaviorLimit());
10881093
}
@@ -1092,8 +1097,11 @@ class TransferNonTransferrableDiagnosticEmitter {
10921097
emitNamedOnlyError(loc, name);
10931098
SmallString<64> descriptiveKindStr;
10941099
{
1095-
llvm::raw_svector_ostream os(descriptiveKindStr);
1096-
getIsolationRegionInfo().printForDiagnostics(os);
1100+
if (!getIsolationRegionInfo().isDisconnected()) {
1101+
llvm::raw_svector_ostream os(descriptiveKindStr);
1102+
getIsolationRegionInfo().printForDiagnostics(os);
1103+
os << ' ';
1104+
}
10971105
}
10981106
diagnoseNote(loc,
10991107
diag::regionbasedisolation_named_isolated_closure_yields_race,
@@ -1127,20 +1135,29 @@ class TransferNonTransferrableDiagnosticEmitter {
11271135
ApplyIsolationCrossing isolationCrossing) {
11281136
emitNamedOnlyError(loc, name);
11291137
SmallString<64> descriptiveKindStr;
1138+
SmallString<64> descriptiveKindStrWithSpace;
11301139
{
1131-
llvm::raw_svector_ostream os(descriptiveKindStr);
1132-
getIsolationRegionInfo().printForDiagnostics(os);
1140+
if (!getIsolationRegionInfo().isDisconnected()) {
1141+
{
1142+
llvm::raw_svector_ostream os(descriptiveKindStr);
1143+
getIsolationRegionInfo().printForDiagnostics(os);
1144+
}
1145+
descriptiveKindStrWithSpace = descriptiveKindStr;
1146+
descriptiveKindStrWithSpace.push_back(' ');
1147+
}
11331148
}
11341149
if (auto calleeInfo = getTransferringCalleeInfo()) {
11351150
diagnoseNote(
11361151
loc,
11371152
diag::regionbasedisolation_named_transfer_non_transferrable_callee,
1138-
name, descriptiveKindStr, isolationCrossing.getCalleeIsolation(),
1139-
calleeInfo->first, calleeInfo->second);
1153+
name, descriptiveKindStrWithSpace,
1154+
isolationCrossing.getCalleeIsolation(), calleeInfo->first,
1155+
calleeInfo->second, descriptiveKindStr);
11401156
} else {
1141-
diagnoseNote(
1142-
loc, diag::regionbasedisolation_named_transfer_non_transferrable,
1143-
name, descriptiveKindStr, isolationCrossing.getCalleeIsolation());
1157+
diagnoseNote(loc,
1158+
diag::regionbasedisolation_named_transfer_non_transferrable,
1159+
name, descriptiveKindStrWithSpace,
1160+
isolationCrossing.getCalleeIsolation(), descriptiveKindStr);
11441161
}
11451162
}
11461163

@@ -1149,8 +1166,11 @@ class TransferNonTransferrableDiagnosticEmitter {
11491166
emitNamedOnlyError(loc, varName);
11501167
SmallString<64> descriptiveKindStr;
11511168
{
1152-
llvm::raw_svector_ostream os(descriptiveKindStr);
1153-
getIsolationRegionInfo().printForDiagnostics(os);
1169+
if (!getIsolationRegionInfo().isDisconnected()) {
1170+
llvm::raw_svector_ostream os(descriptiveKindStr);
1171+
getIsolationRegionInfo().printForDiagnostics(os);
1172+
os << ' ';
1173+
}
11541174
}
11551175
auto diag =
11561176
diag::regionbasedisolation_named_transfer_into_transferring_param;
@@ -1160,13 +1180,21 @@ class TransferNonTransferrableDiagnosticEmitter {
11601180
void emitNamedTransferringReturn(SILLocation loc, Identifier varName) {
11611181
emitNamedOnlyError(loc, varName);
11621182
SmallString<64> descriptiveKindStr;
1183+
SmallString<64> descriptiveKindStrWithSpace;
11631184
{
1164-
llvm::raw_svector_ostream os(descriptiveKindStr);
1165-
getIsolationRegionInfo().printForDiagnostics(os);
1185+
if (!getIsolationRegionInfo().isDisconnected()) {
1186+
{
1187+
llvm::raw_svector_ostream os(descriptiveKindStr);
1188+
getIsolationRegionInfo().printForDiagnostics(os);
1189+
}
1190+
descriptiveKindStrWithSpace = descriptiveKindStr;
1191+
descriptiveKindStrWithSpace.push_back(' ');
1192+
}
11661193
}
11671194
auto diag =
11681195
diag::regionbasedisolation_named_notransfer_transfer_into_result;
1169-
diagnoseNote(loc, diag, descriptiveKindStr, varName);
1196+
diagnoseNote(loc, diag, descriptiveKindStrWithSpace, varName,
1197+
descriptiveKindStr);
11701198
}
11711199

11721200
private:

test/Concurrency/sendable_checking.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ func testNonSendableBaseArg() async {
278278
await t.update()
279279
// expected-targeted-and-complete-warning @-1 {{passing argument of non-sendable type 'NonSendable' into main actor-isolated context may introduce data races}}
280280
// expected-tns-warning @-2 {{sending 't' may cause a data race}}
281-
// expected-tns-note @-3 {{sending disconnected 't' to main actor-isolated instance method 'update()' risks causing data races between main actor-isolated and local nonisolated uses}}
281+
// expected-tns-note @-3 {{sending 't' to main actor-isolated instance method 'update()' risks causing data races between main actor-isolated and local nonisolated uses}}
282282

283283
_ = await t.x
284284
// expected-warning @-1 {{non-sendable type 'NonSendable' passed in implicitly asynchronous call to main actor-isolated property 'x' cannot cross actor boundary}}

0 commit comments

Comments
 (0)