Skip to content

Commit d0a49ad

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 (cherry picked from commit b63781f)
1 parent 705e1c0 commit d0a49ad

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
@@ -157,6 +157,23 @@ static Expr *inferArgumentExprFromApplyExpr(ApplyExpr *sourceApply,
157157
// MARK: Diagnostics
158158
//===----------------------------------------------------------------------===//
159159

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

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

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

@@ -1226,14 +1231,7 @@ class TransferNonTransferrableDiagnosticEmitter {
12261231
}
12271232

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

12391237
void emitUnknownUse(SILLocation loc) {
@@ -1726,14 +1724,7 @@ class InOutSendingNotDisconnectedDiagnosticEmitter {
17261724
}
17271725

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

17391730
void emit();
@@ -1993,13 +1984,7 @@ struct DiagnosticEvaluator final
19931984
}
19941985

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

20051990
bool isActorDerived(Element element) const {

0 commit comments

Comments
 (0)