Skip to content

Commit b63781f

Browse files
committed
[region-isolation] Make "unknown pattern error" always an error.
This shows an actual issue with the compiler where semantically we should crash. Rather than crashing (due to the broken invariants), we emit this error so that the user gets a nice error message at the problem place and can work around it instead of just getting a mysterious crash. Previously, we were making this a warning in swift 5 mode... but given the issues, it makes sense to emit an error diagnostic so we get the feedback and the user cannot ship the code. rdar://131482934
1 parent 5bddd98 commit b63781f

File tree

1 file changed

+22
-37
lines changed

1 file changed

+22
-37
lines changed

lib/SILOptimizer/Mandatory/TransferNonSendable.cpp

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,23 @@ static Expr *inferArgumentExprFromApplyExpr(ApplyExpr *sourceApply,
158158
// MARK: Diagnostics
159159
//===----------------------------------------------------------------------===//
160160

161+
/// Emit the "unknown pattern error" at the SILLocation of \p inst.
162+
static void diagnoseUnknownPatternError(SILInstruction *inst) {
163+
if (shouldAbortOnUnknownPatternMatchError()) {
164+
llvm::report_fatal_error(
165+
"RegionIsolation: Aborting on unknown pattern match error");
166+
}
167+
168+
auto &ctx = inst->getFunction()->getASTContext();
169+
auto loc = inst->getLoc().getSourceLoc();
170+
171+
ctx.Diags.diagnose(loc, diag::regionbasedisolation_unknown_pattern);
172+
}
173+
174+
static void diagnoseUnknownPatternError(Operand *op) {
175+
diagnoseUnknownPatternError(op->getUser());
176+
}
177+
161178
template <typename... T, typename... U>
162179
static InFlightDiagnostic diagnoseError(ASTContext &context, SourceLoc loc,
163180
Diag<T...> diag, U &&...args) {
@@ -732,14 +749,7 @@ class UseAfterTransferDiagnosticEmitter {
732749
}
733750

734751
void emitUnknownPatternError() {
735-
if (shouldAbortOnUnknownPatternMatchError()) {
736-
llvm::report_fatal_error(
737-
"RegionIsolation: Aborting on unknown pattern match error");
738-
}
739-
740-
diagnoseError(transferOp->getUser(),
741-
diag::regionbasedisolation_unknown_pattern)
742-
.limitBehaviorIf(getBehaviorLimit());
752+
diagnoseUnknownPatternError(transferOp->getUser());
743753
}
744754

745755
private:
@@ -1160,12 +1170,7 @@ void TransferNonSendableImpl::emitUseAfterTransferDiagnostics() {
11601170
// tells the user to file a bug. This importantly ensures that we can
11611171
// guarantee that we always find the require if we successfully compile.
11621172
if (!didEmitRequireNote) {
1163-
if (shouldAbortOnUnknownPatternMatchError()) {
1164-
llvm::report_fatal_error(
1165-
"RegionIsolation: Aborting on unknown pattern match error");
1166-
}
1167-
1168-
diagnoseError(transferOp, diag::regionbasedisolation_unknown_pattern);
1173+
diagnoseUnknownPatternError(transferOp);
11691174
continue;
11701175
}
11711176

@@ -1227,14 +1232,7 @@ class TransferNonTransferrableDiagnosticEmitter {
12271232
}
12281233

12291234
void emitUnknownPatternError() {
1230-
if (shouldAbortOnUnknownPatternMatchError()) {
1231-
llvm::report_fatal_error(
1232-
"RegionIsolation: Aborting on unknown pattern match error");
1233-
}
1234-
1235-
diagnoseError(getOperand()->getUser(),
1236-
diag::regionbasedisolation_unknown_pattern)
1237-
.limitBehaviorIf(getBehaviorLimit());
1235+
diagnoseUnknownPatternError(getOperand()->getUser());
12381236
}
12391237

12401238
void emitUnknownUse(SILLocation loc) {
@@ -1727,14 +1725,7 @@ class InOutSendingNotDisconnectedDiagnosticEmitter {
17271725
}
17281726

17291727
void emitUnknownPatternError() {
1730-
if (shouldAbortOnUnknownPatternMatchError()) {
1731-
llvm::report_fatal_error(
1732-
"RegionIsolation: Aborting on unknown pattern match error");
1733-
}
1734-
1735-
diagnoseError(info.functionExitingInst,
1736-
diag::regionbasedisolation_unknown_pattern)
1737-
.limitBehaviorIf(getBehaviorLimit());
1728+
diagnoseUnknownPatternError(info.functionExitingInst);
17381729
}
17391730

17401731
void emit();
@@ -1994,13 +1985,7 @@ struct DiagnosticEvaluator final
19941985
}
19951986

19961987
void handleUnknownCodePattern(const PartitionOp &op) const {
1997-
if (shouldAbortOnUnknownPatternMatchError()) {
1998-
llvm::report_fatal_error(
1999-
"RegionIsolation: Aborting on unknown pattern match error");
2000-
}
2001-
2002-
diagnoseError(op.getSourceInst(),
2003-
diag::regionbasedisolation_unknown_pattern);
1988+
diagnoseUnknownPatternError(op.getSourceInst());
20041989
}
20051990

20061991
bool isActorDerived(Element element) const {

0 commit comments

Comments
 (0)