|
7 | 7 | import liquidjava.diagnostics.errors.IllegalConstructorTransitionError; |
8 | 8 | import liquidjava.diagnostics.errors.InvalidRefinementError; |
9 | 9 | import liquidjava.diagnostics.errors.LJError; |
| 10 | +import liquidjava.diagnostics.errors.SMTUnknownError; |
10 | 11 | import liquidjava.processor.context.*; |
11 | 12 | import liquidjava.processor.refinement_checker.TypeChecker; |
12 | 13 | import liquidjava.processor.refinement_checker.TypeCheckingUtils; |
@@ -430,7 +431,14 @@ public static void updateGhostField(CtFieldWrite<?> fw, TypeChecker tc) throws L |
430 | 431 | Predicate expectState = stateChange.getFrom().substituteVariable(Keys.THIS, instanceName) |
431 | 432 | .changeOldMentions(vi.getName(), instanceName); |
432 | 433 |
|
433 | | - if (!tc.checkStateSMT(prevState, expectState, fw.getPosition())) { // Invalid field transition |
| 434 | + boolean validTransition; |
| 435 | + try { |
| 436 | + validTransition = tc.checkStateSMT(prevState, expectState, fw.getPosition()); |
| 437 | + } catch (SMTUnknownError error) { |
| 438 | + error.setDeclarationPosition(field.getDeclaringType().getPosition()); |
| 439 | + throw error; |
| 440 | + } |
| 441 | + if (!validTransition) { // Invalid field transition |
434 | 442 | tc.throwStateRefinementError(fw.getPosition(), field.getDeclaringType().getPosition(), prevState, |
435 | 443 | expectState, stateChange.getMessage()); |
436 | 444 | return; |
@@ -496,7 +504,12 @@ private static void changeState(TypeChecker tc, VariableInstance vi, RefinedFunc |
496 | 504 | } |
497 | 505 | expectState = expectState.changeOldMentions(vi.getName(), instanceName); |
498 | 506 |
|
499 | | - found = tc.checkStateSMT(prevCheck, expectState, invocation.getPosition()); |
| 507 | + try { |
| 508 | + found = tc.checkStateSMT(prevCheck, expectState, invocation.getPosition()); |
| 509 | + } catch (SMTUnknownError error) { |
| 510 | + error.setDeclarationPosition(stateChange.getFromPosition()); |
| 511 | + throw error; |
| 512 | + } |
500 | 513 | if (found && stateChange.hasTo()) { |
501 | 514 | String newInstanceName = String.format(Formats.INSTANCE, name, tc.getContext().getCounter()); |
502 | 515 | // Non-void: `_` is the return value; void: legacy alias for the new instance. |
|
0 commit comments