@@ -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+
161178template <typename ... T, typename ... U>
162179static 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
745755private:
@@ -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