[rbi] Use interned StringRefs for diagnostics instead of SmallString<64>.

This makes the code easier to write and also prevents any lifetime issues from a
diagnostic outliving the SmallString due to diagnostic transactions.
This commit is contained in:
Michael Gottesman
2025-07-02 16:11:43 -07:00
parent 14634b6847
commit 010fa39f31
5 changed files with 180 additions and 268 deletions

View File

@@ -1005,11 +1005,11 @@ NOTE(regionbasedisolation_type_use_after_send_callee, none,
(Type, StringRef, const ValueDecl *, StringRef)) (Type, StringRef, const ValueDecl *, StringRef))
NOTE(regionbasedisolation_named_info_send_yields_race, none, NOTE(regionbasedisolation_named_info_send_yields_race, none,
"sending %1%0 to %2 callee risks causing data races between %2 and local %3 uses", "sending %select{%2 |}0%1 to %3 callee risks causing data races between %3 and local %4 uses",
(Identifier, StringRef, StringRef, StringRef)) (bool, Identifier, StringRef, StringRef, StringRef))
NOTE(regionbasedisolation_named_info_send_yields_race_callee, none, NOTE(regionbasedisolation_named_info_send_yields_race_callee, none,
"sending %1%0 to %2 %kind3 risks causing data races between %2 and local %4 uses", "sending %select{%2 |}0%1 to %3 %kind4 risks causing data races between %3 and local %5 uses",
(Identifier, StringRef, StringRef, const ValueDecl *, StringRef)) (bool, Identifier, StringRef, StringRef, const ValueDecl *, StringRef))
// Use after send closure. // Use after send closure.
NOTE(regionbasedisolation_type_isolated_capture_yields_race, none, NOTE(regionbasedisolation_type_isolated_capture_yields_race, none,
@@ -1025,8 +1025,8 @@ NOTE(regionbasedisolation_named_value_used_after_explicit_sending, none,
"%0 used after being passed as a 'sending' parameter; Later uses could race", "%0 used after being passed as a 'sending' parameter; Later uses could race",
(Identifier)) (Identifier))
NOTE(regionbasedisolation_named_isolated_closure_yields_race, none, NOTE(regionbasedisolation_named_isolated_closure_yields_race, none,
"%0%1 is captured by a %2 closure. %2 uses in closure may race against later %3 uses", "%select{%1 |}0%2 is captured by a %3 closure. %3 uses in closure may race against later %4 uses",
(StringRef, Identifier, StringRef, StringRef)) (bool, StringRef, Identifier, StringRef, StringRef))
NOTE(regionbasedisolation_typed_use_after_sending, none, NOTE(regionbasedisolation_typed_use_after_sending, none,
"Passing value of non-Sendable type %0 as a 'sending' argument risks causing races in between local and caller code", "Passing value of non-Sendable type %0 as a 'sending' argument risks causing races in between local and caller code",
@@ -1039,19 +1039,19 @@ NOTE(regionbasedisolation_typed_use_after_sending_callee, none,
// Sending Never Sendable Emitter // Sending Never Sendable Emitter
NOTE(regionbasedisolation_named_send_never_sendable, none, NOTE(regionbasedisolation_named_send_never_sendable, none,
"sending %1%0 to %2 callee risks causing data races between %2 and %3 uses", "sending %select{%2 |}0%1 to %3 callee risks causing data races between %3 and %4 uses",
(Identifier, StringRef, StringRef, StringRef)) (bool, Identifier, StringRef, StringRef, StringRef))
NOTE(regionbasedisolation_named_send_never_sendable_callee, none, NOTE(regionbasedisolation_named_send_never_sendable_callee, none,
"sending %1%0 to %2 %kind3 risks causing data races between %2 and %4 uses", "sending %select{%2 |}0%1 to %3 %kind4 risks causing data races between %3 and %5 uses",
(Identifier, StringRef, StringRef, const ValueDecl *, StringRef)) (bool, Identifier, StringRef, StringRef, const ValueDecl *, StringRef))
NOTE(regionbasedisolation_named_send_into_sending_param, none, NOTE(regionbasedisolation_named_send_into_sending_param, none,
"%0%1 is passed as a 'sending' parameter; Uses in callee may race with " "%select{%1 |}0%2 is passed as a 'sending' parameter; Uses in callee may race with "
"later %0uses", "later %1 uses",
(StringRef, Identifier)) (bool, StringRef, Identifier))
NOTE(regionbasedisolation_named_nosend_send_into_result, none, NOTE(regionbasedisolation_named_nosend_send_into_result, none,
"%0%1 cannot be a 'sending' result. %2 uses may race with caller uses", "%select{%1 |}0%2 cannot be a 'sending' result. %3 uses may race with caller uses",
(StringRef, Identifier, StringRef)) (bool, StringRef, Identifier, StringRef))
NOTE(regionbasedisolation_typed_tns_passed_to_sending, none, NOTE(regionbasedisolation_typed_tns_passed_to_sending, none,
"Passing %0 value of non-Sendable type %1 as a 'sending' parameter risks " "Passing %0 value of non-Sendable type %1 as a 'sending' parameter risks "
"causing races inbetween %0 uses and uses reachable from the callee", "causing races inbetween %0 uses and uses reachable from the callee",
@@ -1109,10 +1109,10 @@ NOTE(regionbasedisolation_inout_sending_must_be_reinitialized, none,
"'inout sending' parameter must be reinitialized before function exit with a non-actor-isolated value", "'inout sending' parameter must be reinitialized before function exit with a non-actor-isolated value",
()) ())
ERROR(regionbasedisolation_inout_sending_cannot_be_actor_isolated, none, ERROR(regionbasedisolation_inout_sending_cannot_be_actor_isolated, none,
"'inout sending' parameter %0 cannot be %1at end of function", "'inout sending' parameter %0 cannot be %1 at end of function",
(Identifier, StringRef)) (Identifier, StringRef))
NOTE(regionbasedisolation_inout_sending_cannot_be_actor_isolated_note, none, NOTE(regionbasedisolation_inout_sending_cannot_be_actor_isolated_note, none,
"%1%0 risks causing races in between %1uses and caller uses since caller assumes value is not actor isolated", "%1 %0 risks causing races in between %1 uses and caller uses since caller assumes value is not actor isolated",
(Identifier, StringRef)) (Identifier, StringRef))
//=== //===

View File

@@ -230,7 +230,7 @@ public:
private: private:
bool isOperatorSlow() const; bool isOperatorSlow() const;
}; };
class DeclName; class DeclName;
class DeclNameRef; class DeclNameRef;
class ObjCSelector; class ObjCSelector;

View File

@@ -332,8 +332,16 @@ public:
/// form of diagnostic than other cases. /// form of diagnostic than other cases.
void printForCodeDiagnostic(SILFunction *fn, llvm::raw_ostream &os) const; void printForCodeDiagnostic(SILFunction *fn, llvm::raw_ostream &os) const;
/// Overload of printForCodeDiagnostics that returns an interned StringRef
/// owned by the AST.
StringRef printForCodeDiagnostic(SILFunction *fn) const;
void printForDiagnostics(SILFunction *fn, llvm::raw_ostream &os) const; void printForDiagnostics(SILFunction *fn, llvm::raw_ostream &os) const;
/// Overload of printForDiagnostics that returns an interned StringRef owned
/// by the AST.
StringRef printForDiagnostics(SILFunction *fn) const;
SWIFT_DEBUG_DUMPER(dumpForDiagnostics(SILFunction *fn)) { SWIFT_DEBUG_DUMPER(dumpForDiagnostics(SILFunction *fn)) {
printForDiagnostics(fn, llvm::dbgs()); printForDiagnostics(fn, llvm::dbgs());
llvm::dbgs() << '\n'; llvm::dbgs() << '\n';
@@ -524,6 +532,12 @@ public:
SILFunction *fn, ActorIsolation iso, llvm::raw_ostream &os, SILFunction *fn, ActorIsolation iso, llvm::raw_ostream &os,
StringRef openingQuotationMark = "'", bool asNoun = false); StringRef openingQuotationMark = "'", bool asNoun = false);
/// Overload for printActorIsolationForDiagnostics that produces a StringRef.
static StringRef
printActorIsolationForDiagnostics(SILFunction *fn, ActorIsolation iso,
StringRef openingQuotationMark = "'",
bool asNoun = false);
void Profile(llvm::FoldingSetNodeID &id) const; void Profile(llvm::FoldingSetNodeID &id) const;
private: private:
@@ -593,6 +607,10 @@ public:
innerInfo.printForDiagnostics(fn, os); innerInfo.printForDiagnostics(fn, os);
} }
StringRef printForDiagnostics(SILFunction *fn) const {
return innerInfo.printForDiagnostics(fn);
}
SWIFT_DEBUG_DUMPER(dumpForDiagnostics(SILFunction *fn)) { SWIFT_DEBUG_DUMPER(dumpForDiagnostics(SILFunction *fn)) {
innerInfo.dumpForDiagnostics(fn); innerInfo.dumpForDiagnostics(fn);
} }
@@ -601,6 +619,10 @@ public:
innerInfo.printForCodeDiagnostic(fn, os); innerInfo.printForCodeDiagnostic(fn, os);
} }
StringRef printForCodeDiagnostic(SILFunction *fn) const {
return innerInfo.printForCodeDiagnostic(fn);
}
void printForOneLineLogging(SILFunction *fn, llvm::raw_ostream &os) const { void printForOneLineLogging(SILFunction *fn, llvm::raw_ostream &os) const {
innerInfo.printForOneLineLogging(fn, os); innerInfo.printForOneLineLogging(fn, os);
} }

View File

@@ -686,37 +686,24 @@ public:
.limitBehaviorIf(getBehaviorLimit()); .limitBehaviorIf(getBehaviorLimit());
// Then emit the note with greater context. // Then emit the note with greater context.
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ namedValuesIsolationInfo.printForDiagnostics(getFunction());
if (!namedValuesIsolationInfo.isDisconnected()) { auto calleeIsolationStr =
llvm::raw_svector_ostream os(descriptiveKindStr); SILIsolationInfo::printActorIsolationForDiagnostics(
namedValuesIsolationInfo.printForDiagnostics(getFunction(), os); getFunction(), isolationCrossing.getCalleeIsolation());
os << ' '; auto callerIsolationStr =
} SILIsolationInfo::printActorIsolationForDiagnostics(
} getFunction(), isolationCrossing.getCallerIsolation());
SmallString<64> calleeIsolationStr;
{
llvm::raw_svector_ostream os(calleeIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing.getCalleeIsolation(), os);
}
SmallString<64> callerIsolationStr;
{
llvm::raw_svector_ostream os(callerIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing.getCallerIsolation(), os);
}
bool isDisconnected = namedValuesIsolationInfo.isDisconnected();
if (auto callee = getSendingCallee()) { if (auto callee = getSendingCallee()) {
diagnoseNote( diagnoseNote(
loc, diag::regionbasedisolation_named_info_send_yields_race_callee, loc, diag::regionbasedisolation_named_info_send_yields_race_callee,
name, descriptiveKindStr, calleeIsolationStr, callee.value(), isDisconnected, name, descriptiveKindStr, calleeIsolationStr,
callerIsolationStr); callee.value(), callerIsolationStr);
} else { } else {
diagnoseNote(loc, diag::regionbasedisolation_named_info_send_yields_race, diagnoseNote(loc, diag::regionbasedisolation_named_info_send_yields_race,
name, descriptiveKindStr, calleeIsolationStr, isDisconnected, name, descriptiveKindStr, calleeIsolationStr,
callerIsolationStr); callerIsolationStr);
} }
emitRequireInstDiagnostics(); emitRequireInstDiagnostics();
@@ -733,33 +720,20 @@ public:
.limitBehaviorIf(getBehaviorLimit()); .limitBehaviorIf(getBehaviorLimit());
// Then emit the note with greater context. // Then emit the note with greater context.
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ namedValuesIsolationInfo.printForDiagnostics(getFunction());
if (!namedValuesIsolationInfo.isDisconnected()) { auto calleeIsolationStr =
llvm::raw_svector_ostream os(descriptiveKindStr); SILIsolationInfo::printActorIsolationForDiagnostics(
namedValuesIsolationInfo.printForDiagnostics(getFunction(), os); getFunction(), isolationCrossing.getCalleeIsolation());
os << ' '; auto callerIsolationStr =
} SILIsolationInfo::printActorIsolationForDiagnostics(
} getFunction(), isolationCrossing.getCallerIsolation());
bool isDisconnected = namedValuesIsolationInfo.isDisconnected();
SmallString<64> calleeIsolationStr;
{
llvm::raw_svector_ostream os(calleeIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing.getCalleeIsolation(), os);
}
SmallString<64> callerIsolationStr;
{
llvm::raw_svector_ostream os(callerIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing.getCallerIsolation(), os);
}
diagnoseNote(loc, diagnoseNote(loc,
diag::regionbasedisolation_named_info_send_yields_race_callee, diag::regionbasedisolation_named_info_send_yields_race_callee,
name, descriptiveKindStr, calleeIsolationStr, callee, isDisconnected, name, descriptiveKindStr, calleeIsolationStr,
callerIsolationStr); callee, callerIsolationStr);
emitRequireInstDiagnostics(); emitRequireInstDiagnostics();
} }
@@ -782,19 +756,12 @@ public:
.highlight(loc.getSourceRange()) .highlight(loc.getSourceRange())
.limitBehaviorIf(getBehaviorLimit()); .limitBehaviorIf(getBehaviorLimit());
SmallString<64> calleeIsolationStr; auto calleeIsolationStr =
{ SILIsolationInfo::printActorIsolationForDiagnostics(
llvm::raw_svector_ostream os(calleeIsolationStr); getFunction(), isolationCrossing.getCalleeIsolation());
SILIsolationInfo::printActorIsolationForDiagnostics( auto callerIsolationStr =
getFunction(), isolationCrossing.getCalleeIsolation(), os); SILIsolationInfo::printActorIsolationForDiagnostics(
} getFunction(), isolationCrossing.getCallerIsolation());
SmallString<64> callerIsolationStr;
{
llvm::raw_svector_ostream os(callerIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing.getCallerIsolation(), os);
}
if (auto callee = getSendingCallee()) { if (auto callee = getSendingCallee()) {
diagnoseNote(loc, diag::regionbasedisolation_type_use_after_send_callee, diagnoseNote(loc, diag::regionbasedisolation_type_use_after_send_callee,
@@ -848,32 +815,19 @@ public:
.highlight(loc.getSourceRange()) .highlight(loc.getSourceRange())
.limitBehaviorIf(getBehaviorLimit()); .limitBehaviorIf(getBehaviorLimit());
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ namedValuesIsolationInfo.printForDiagnostics(getFunction());
if (!namedValuesIsolationInfo.isDisconnected()) { auto calleeIsolationStr =
llvm::raw_svector_ostream os(descriptiveKindStr); SILIsolationInfo::printActorIsolationForDiagnostics(
namedValuesIsolationInfo.printForDiagnostics(getFunction(), os); getFunction(), isolationCrossing.getCalleeIsolation());
os << ' '; auto callerIsolationStr =
} SILIsolationInfo::printActorIsolationForDiagnostics(
} getFunction(), isolationCrossing.getCallerIsolation());
bool isDisconnected = namedValuesIsolationInfo.isDisconnected();
SmallString<64> calleeIsolationStr; diagnoseNote(loc,
{ diag::regionbasedisolation_named_isolated_closure_yields_race,
llvm::raw_svector_ostream os(calleeIsolationStr); isDisconnected, descriptiveKindStr, name, calleeIsolationStr,
SILIsolationInfo::printActorIsolationForDiagnostics( callerIsolationStr)
getFunction(), isolationCrossing.getCalleeIsolation(), os);
}
SmallString<64> callerIsolationStr;
{
llvm::raw_svector_ostream os(callerIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing.getCallerIsolation(), os);
}
diagnoseNote(
loc, diag::regionbasedisolation_named_isolated_closure_yields_race,
descriptiveKindStr, name, calleeIsolationStr, callerIsolationStr)
.highlight(loc.getSourceRange()); .highlight(loc.getSourceRange());
emitRequireInstDiagnostics(); emitRequireInstDiagnostics();
} }
@@ -886,19 +840,12 @@ public:
.highlight(loc.getSourceRange()) .highlight(loc.getSourceRange())
.limitBehaviorIf(getBehaviorLimit()); .limitBehaviorIf(getBehaviorLimit());
SmallString<64> calleeIsolationStr; auto calleeIsolationStr =
{ SILIsolationInfo::printActorIsolationForDiagnostics(
llvm::raw_svector_ostream os(calleeIsolationStr); getFunction(), isolationCrossing.getCalleeIsolation());
SILIsolationInfo::printActorIsolationForDiagnostics( auto callerIsolationStr =
getFunction(), isolationCrossing.getCalleeIsolation(), os); SILIsolationInfo::printActorIsolationForDiagnostics(
} getFunction(), isolationCrossing.getCallerIsolation());
SmallString<64> callerIsolationStr;
{
llvm::raw_svector_ostream os(callerIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing.getCallerIsolation(), os);
}
diagnoseNote(loc, diagnoseNote(loc,
diag::regionbasedisolation_type_isolated_capture_yields_race, diag::regionbasedisolation_type_isolated_capture_yields_race,
@@ -1419,18 +1366,11 @@ public:
.highlight(loc.getSourceRange()) .highlight(loc.getSourceRange())
.limitBehaviorIf(getBehaviorLimit()); .limitBehaviorIf(getBehaviorLimit());
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr); auto calleeIsolationStr =
getIsolationRegionInfo().printForDiagnostics(getFunction(), os); SILIsolationInfo::printActorIsolationForDiagnostics(
} getFunction(), crossing.getCalleeIsolation());
SmallString<64> calleeIsolationStr;
{
llvm::raw_svector_ostream os(calleeIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), crossing.getCalleeIsolation(), os);
}
if (auto callee = getSendingCallee()) { if (auto callee = getSendingCallee()) {
diagnoseNote( diagnoseNote(
@@ -1447,32 +1387,20 @@ public:
void emitNamedFunctionArgumentClosure(SILLocation loc, Identifier name, void emitNamedFunctionArgumentClosure(SILLocation loc, Identifier name,
ApplyIsolationCrossing crossing) { ApplyIsolationCrossing crossing) {
emitNamedOnlyError(loc, name); emitNamedOnlyError(loc, name);
SmallString<64> descriptiveKindStr;
{
if (!getIsolationRegionInfo().isDisconnected()) {
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().printForDiagnostics(getFunction(), os);
os << ' ';
}
}
SmallString<64> calleeIsolationStr; auto descriptiveKindStr =
{ getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(calleeIsolationStr); auto calleeIsolationStr =
SILIsolationInfo::printActorIsolationForDiagnostics( SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), crossing.getCalleeIsolation(), os); getFunction(), crossing.getCalleeIsolation());
} auto callerIsolationStr =
SILIsolationInfo::printActorIsolationForDiagnostics(
SmallString<64> callerIsolationStr; getFunction(), crossing.getCallerIsolation());
{ bool isDisconnected = getIsolationRegionInfo().isDisconnected();
llvm::raw_svector_ostream os(callerIsolationStr); diagnoseNote(loc,
SILIsolationInfo::printActorIsolationForDiagnostics( diag::regionbasedisolation_named_isolated_closure_yields_race,
getFunction(), crossing.getCallerIsolation(), os); isDisconnected, descriptiveKindStr, name, calleeIsolationStr,
} callerIsolationStr)
diagnoseNote(
loc, diag::regionbasedisolation_named_isolated_closure_yields_race,
descriptiveKindStr, name, calleeIsolationStr, callerIsolationStr)
.highlight(loc.getSourceRange()); .highlight(loc.getSourceRange());
} }
@@ -1483,11 +1411,8 @@ public:
.highlight(loc.getSourceRange()) .highlight(loc.getSourceRange())
.limitBehaviorIf(getBehaviorLimit()); .limitBehaviorIf(getBehaviorLimit());
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().printForDiagnostics(getFunction(), os);
}
if (auto callee = getSendingCallee()) { if (auto callee = getSendingCallee()) {
diagnoseNote( diagnoseNote(
@@ -1505,12 +1430,8 @@ public:
void emitClosureErrorWithCapturedActor(Operand *partialApplyOp, void emitClosureErrorWithCapturedActor(Operand *partialApplyOp,
Operand *actualUse, Operand *actualUse,
SILArgument *fArg) { SILArgument *fArg) {
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ getIsolationRegionInfo().printForCodeDiagnostic(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().getIsolationInfo().printForCodeDiagnostic(
getFunction(), os);
}
diagnoseError(partialApplyOp, diagnoseError(partialApplyOp,
diag::regionbasedisolation_typed_tns_passed_sending_closure, diag::regionbasedisolation_typed_tns_passed_sending_closure,
@@ -1518,12 +1439,8 @@ public:
.limitBehaviorIf(getDiagnosticBehaviorLimitForOperands( .limitBehaviorIf(getDiagnosticBehaviorLimitForOperands(
actualUse->getFunction(), {actualUse})); actualUse->getFunction(), {actualUse}));
descriptiveKindStr.clear(); descriptiveKindStr =
{ getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().getIsolationInfo().printForDiagnostics(
getFunction(), os);
}
diagnoseNote(actualUse, diag::regionbasedisolation_closure_captures_actor, diagnoseNote(actualUse, diag::regionbasedisolation_closure_captures_actor,
fArg->getDecl()->getName(), descriptiveKindStr); fArg->getDecl()->getName(), descriptiveKindStr);
} }
@@ -1538,12 +1455,8 @@ public:
void emitSendingClosureParamDirectlyIsolated(Operand *partialApplyOp, void emitSendingClosureParamDirectlyIsolated(Operand *partialApplyOp,
Operand *actualUse, Operand *actualUse,
SILArgument *fArg) { SILArgument *fArg) {
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ getIsolationRegionInfo().printForCodeDiagnostic(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().getIsolationInfo().printForCodeDiagnostic(
getFunction(), os);
}
diagnoseError(partialApplyOp, diagnoseError(partialApplyOp,
diag::regionbasedisolation_typed_tns_passed_sending_closure, diag::regionbasedisolation_typed_tns_passed_sending_closure,
@@ -1567,11 +1480,8 @@ public:
return; return;
} }
descriptiveKindStr.clear(); descriptiveKindStr =
{ getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().printForDiagnostics(getFunction(), os);
}
auto diag = diag:: auto diag = diag::
regionbasedisolation_typed_tns_passed_to_sending_closure_helper_have_value; regionbasedisolation_typed_tns_passed_to_sending_closure_helper_have_value;
@@ -1588,11 +1498,8 @@ public:
return; return;
} }
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ getIsolationRegionInfo()->printForCodeDiagnostic(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo()->printForCodeDiagnostic(getFunction(), os);
}
auto emitMainError = [&] { auto emitMainError = [&] {
auto behaviorLimit = getDiagnosticBehaviorLimitForOperands( auto behaviorLimit = getDiagnosticBehaviorLimitForOperands(
@@ -1624,11 +1531,8 @@ public:
} }
emitMainError(); emitMainError();
descriptiveKindStr.clear(); descriptiveKindStr =
{ getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().printForDiagnostics(getFunction(), os);
}
auto diag = diag:: auto diag = diag::
regionbasedisolation_typed_tns_passed_to_sending_closure_helper_have_value_region; regionbasedisolation_typed_tns_passed_to_sending_closure_helper_have_value_region;
diagnoseNote(actualUseInfo->first, diag, descriptiveKindStr, diagnoseNote(actualUseInfo->first, diag, descriptiveKindStr,
@@ -1669,11 +1573,8 @@ public:
"Should never be disconnected?!"); "Should never be disconnected?!");
emitNamedOnlyError(loc, name); emitNamedOnlyError(loc, name);
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().printForDiagnostics(getFunction(), os);
}
diagnoseNote(loc, diag::regionbasedisolation_named_send_nt_asynclet_capture, diagnoseNote(loc, diag::regionbasedisolation_named_send_nt_asynclet_capture,
name, descriptiveKindStr) name, descriptiveKindStr)
@@ -1683,34 +1584,22 @@ public:
void emitNamedIsolation(SILLocation loc, Identifier name, void emitNamedIsolation(SILLocation loc, Identifier name,
ApplyIsolationCrossing isolationCrossing) { ApplyIsolationCrossing isolationCrossing) {
emitNamedOnlyError(loc, name); emitNamedOnlyError(loc, name);
SmallString<64> descriptiveKindStr;
SmallString<64> descriptiveKindStrWithSpace;
{
if (!getIsolationRegionInfo().isDisconnected()) {
{
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().printForDiagnostics(getFunction(), os);
}
descriptiveKindStrWithSpace = descriptiveKindStr;
descriptiveKindStrWithSpace.push_back(' ');
}
}
SmallString<64> calleeIsolationStr; auto descriptiveKindStr =
{ getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(calleeIsolationStr); auto calleeIsolationStr =
SILIsolationInfo::printActorIsolationForDiagnostics( SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing.getCalleeIsolation(), os); getFunction(), isolationCrossing.getCalleeIsolation());
} bool isDisconnected = getIsolationRegionInfo().isDisconnected();
if (auto callee = getSendingCallee()) { if (auto callee = getSendingCallee()) {
diagnoseNote(loc, diagnoseNote(loc,
diag::regionbasedisolation_named_send_never_sendable_callee, diag::regionbasedisolation_named_send_never_sendable_callee,
name, descriptiveKindStrWithSpace, calleeIsolationStr, isDisconnected, name, descriptiveKindStr, calleeIsolationStr,
callee.value(), descriptiveKindStr); callee.value(), descriptiveKindStr);
} else { } else {
diagnoseNote(loc, diag::regionbasedisolation_named_send_never_sendable, diagnoseNote(loc, diag::regionbasedisolation_named_send_never_sendable,
name, descriptiveKindStrWithSpace, calleeIsolationStr, isDisconnected, name, descriptiveKindStr, calleeIsolationStr,
descriptiveKindStr); descriptiveKindStr);
} }
} }
@@ -1718,34 +1607,21 @@ public:
void emitNamedSendingNeverSendableToSendingParam(SILLocation loc, void emitNamedSendingNeverSendableToSendingParam(SILLocation loc,
Identifier varName) { Identifier varName) {
emitNamedOnlyError(loc, varName); emitNamedOnlyError(loc, varName);
SmallString<64> descriptiveKindStr;
{ auto descriptiveKindStr =
if (!getIsolationRegionInfo().isDisconnected()) { getIsolationRegionInfo().printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr); bool isDisconnected = getIsolationRegionInfo().isDisconnected();
getIsolationRegionInfo().printForDiagnostics(getFunction(), os);
os << ' ';
}
}
auto diag = diag::regionbasedisolation_named_send_into_sending_param; auto diag = diag::regionbasedisolation_named_send_into_sending_param;
diagnoseNote(loc, diag, descriptiveKindStr, varName); diagnoseNote(loc, diag, isDisconnected, descriptiveKindStr, varName);
} }
void emitNamedSendingReturn(SILLocation loc, Identifier varName) { void emitNamedSendingReturn(SILLocation loc, Identifier varName) {
emitNamedOnlyError(loc, varName); emitNamedOnlyError(loc, varName);
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
SmallString<64> descriptiveKindStrWithSpace; getIsolationRegionInfo().printForDiagnostics(getFunction());
{ bool isDisconnected = getIsolationRegionInfo().isDisconnected();
if (!getIsolationRegionInfo().isDisconnected()) {
{
llvm::raw_svector_ostream os(descriptiveKindStr);
getIsolationRegionInfo().printForDiagnostics(getFunction(), os);
}
descriptiveKindStrWithSpace = descriptiveKindStr;
descriptiveKindStrWithSpace.push_back(' ');
}
}
auto diag = diag::regionbasedisolation_named_nosend_send_into_result; auto diag = diag::regionbasedisolation_named_nosend_send_into_result;
diagnoseNote(loc, diag, descriptiveKindStrWithSpace, varName, diagnoseNote(loc, diag, isDisconnected, descriptiveKindStr, varName,
descriptiveKindStr); descriptiveKindStr);
} }
@@ -2060,7 +1936,6 @@ bool SentNeverSendableDiagnosticInferrer::run() {
return true; return true;
// See if we can infer a name from the value. // See if we can infer a name from the value.
SmallString<64> resultingName;
if (auto varName = inferNameHelper(op->get())) { if (auto varName = inferNameHelper(op->get())) {
diagnosticEmitter.emitNamedSendingNeverSendableToSendingParam( diagnosticEmitter.emitNamedSendingNeverSendableToSendingParam(
loc, *varName); loc, *varName);
@@ -2101,7 +1976,6 @@ bool SentNeverSendableDiagnosticInferrer::run() {
} }
// See if we can infer a name from the value. // See if we can infer a name from the value.
SmallString<64> resultingName;
if (auto name = inferNameHelper(op->get())) { if (auto name = inferNameHelper(op->get())) {
diagnosticEmitter.emitNamedIsolation(loc, *name, *isolation); diagnosticEmitter.emitNamedIsolation(loc, *name, *isolation);
return true; return true;
@@ -2149,7 +2023,6 @@ bool SentNeverSendableDiagnosticInferrer::run() {
}) && }) &&
"All result info must be the same... if that changes... update " "All result info must be the same... if that changes... update "
"this code!"); "this code!");
SmallString<64> resultingName;
if (auto name = inferNameHelper(op->get())) { if (auto name = inferNameHelper(op->get())) {
diagnosticEmitter.emitNamedSendingReturn(loc, *name); diagnosticEmitter.emitNamedSendingReturn(loc, *name);
return true; return true;
@@ -2298,12 +2171,8 @@ void InOutSendingNotDisconnectedDiagnosticEmitter::emit() {
} }
// Then emit the note with greater context. // Then emit the note with greater context.
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ actorIsolatedRegionInfo.printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
actorIsolatedRegionInfo.printForDiagnostics(getFunction(), os);
os << ' ';
}
diagnoseError( diagnoseError(
functionExitingInst, functionExitingInst,
@@ -2458,11 +2327,8 @@ static SILValue findOutParameter(SILValue v) {
void AssignIsolatedIntoSendingResultDiagnosticEmitter::emit() { void AssignIsolatedIntoSendingResultDiagnosticEmitter::emit() {
// Then emit the note with greater context. // Then emit the note with greater context.
SmallString<64> descriptiveKindStr; auto descriptiveKindStr =
{ isolatedValueIsolationRegionInfo.printForDiagnostics(getFunction());
llvm::raw_svector_ostream os(descriptiveKindStr);
isolatedValueIsolationRegionInfo.printForDiagnostics(getFunction(), os);
}
// Grab the var name if we can find it. // Grab the var name if we can find it.
if (auto varName = VariableNameInferrer::inferName(srcOperand->get())) { if (auto varName = VariableNameInferrer::inferName(srcOperand->get())) {
@@ -2706,19 +2572,10 @@ void NonSendableIsolationCrossingResultDiagnosticEmitter::emit() {
if (!isolationCrossing) if (!isolationCrossing)
return emitUnknownPatternError(); return emitUnknownPatternError();
SmallString<64> calleeIsolationStr; auto calleeIsolationStr = SILIsolationInfo::printActorIsolationForDiagnostics(
{ getFunction(), isolationCrossing->getCalleeIsolation());
llvm::raw_svector_ostream os(calleeIsolationStr); auto callerIsolationStr = SILIsolationInfo::printActorIsolationForDiagnostics(
SILIsolationInfo::printActorIsolationForDiagnostics( getFunction(), isolationCrossing->getCallerIsolation());
getFunction(), isolationCrossing->getCalleeIsolation(), os);
}
SmallString<64> callerIsolationStr;
{
llvm::raw_svector_ostream os(callerIsolationStr);
SILIsolationInfo::printActorIsolationForDiagnostics(
getFunction(), isolationCrossing->getCallerIsolation(), os);
}
auto type = getType(); auto type = getType();
if (getCalledDecl()) { if (getCalledDecl()) {

View File

@@ -1096,6 +1096,19 @@ void SILIsolationInfo::printOptions(llvm::raw_ostream &os) const {
llvm::interleave(data, os, ", "); llvm::interleave(data, os, ", ");
} }
StringRef SILIsolationInfo::printActorIsolationForDiagnostics(
SILFunction *fn, ActorIsolation iso, StringRef openingQuotationMark,
bool asNoun) {
SmallString<64> string;
{
llvm::raw_svector_ostream os(string);
printActorIsolationForDiagnostics(fn, iso, os, openingQuotationMark,
asNoun);
}
return fn->getASTContext().getIdentifier(string).str();
}
void SILIsolationInfo::printActorIsolationForDiagnostics( void SILIsolationInfo::printActorIsolationForDiagnostics(
SILFunction *fn, ActorIsolation iso, llvm::raw_ostream &os, SILFunction *fn, ActorIsolation iso, llvm::raw_ostream &os,
StringRef openingQuotationMark, bool asNoun) { StringRef openingQuotationMark, bool asNoun) {
@@ -1250,6 +1263,16 @@ void SILIsolationInfo::Profile(llvm::FoldingSetNodeID &id) const {
} }
} }
StringRef SILIsolationInfo::printForDiagnostics(SILFunction *fn) const {
SmallString<64> string;
{
llvm::raw_svector_ostream os(string);
printForDiagnostics(fn, os);
}
return fn->getASTContext().getIdentifier(string).str();
}
void SILIsolationInfo::printForDiagnostics(SILFunction *fn, void SILIsolationInfo::printForDiagnostics(SILFunction *fn,
llvm::raw_ostream &os) const { llvm::raw_ostream &os) const {
switch (Kind(*this)) { switch (Kind(*this)) {
@@ -1309,6 +1332,16 @@ void SILIsolationInfo::printForDiagnostics(SILFunction *fn,
} }
} }
StringRef SILIsolationInfo::printForCodeDiagnostic(SILFunction *fn) const {
SmallString<64> string;
{
llvm::raw_svector_ostream os(string);
printForCodeDiagnostic(fn, os);
}
return fn->getASTContext().getIdentifier(string).str();
}
void SILIsolationInfo::printForCodeDiagnostic(SILFunction *fn, void SILIsolationInfo::printForCodeDiagnostic(SILFunction *fn,
llvm::raw_ostream &os) const { llvm::raw_ostream &os) const {
switch (Kind(*this)) { switch (Kind(*this)) {