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