diff --git a/src/main/java/de/tla2b/analysis/TypeChecker.java b/src/main/java/de/tla2b/analysis/TypeChecker.java index d32b67acd2ea0beec0a6d65c9f46fac0a7b95578..82c94f4caf48870bf7741a63c957769fe326cf61 100644 --- a/src/main/java/de/tla2b/analysis/TypeChecker.java +++ b/src/main/java/de/tla2b/analysis/TypeChecker.java @@ -1193,25 +1193,44 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, case B_OPCODE_div: // / case B_OPCODE_mod: // % modulo case B_OPCODE_exp: { // x hoch y, x^y - try { - RealType.getInstance().unify(expected); - for (int i = 0; i < n.getArgs().length; i++) { - visitExprOrOpArgNode(n.getArgs()[i], RealType.getInstance()); + TLAType type; + // TODO: Simplify + if (expected instanceof RealType) { + try { + RealType.getInstance().unify(expected); + type = RealType.getInstance(); + } catch (UnificationException e) { + throw new TypeErrorException(String.format("Expected %s, found REAL at '%s',%n%s", expected, + n.getOperator().getName(), n.getLocation())); } - return RealType.getInstance(); - } catch (UnificationException e) { + } else if (expected instanceof IntType) { try { IntType.getInstance().unify(expected); - for (int i = 0; i < n.getArgs().length; i++) { - visitExprOrOpArgNode(n.getArgs()[i], IntType.getInstance()); - } - return IntType.getInstance(); - } catch (UnificationException e2) { + type = IntType.getInstance(); + } catch (UnificationException ue) { throw new TypeErrorException(String.format("Expected %s, found INTEGER at '%s',%n%s", expected, n.getOperator().getName(), n.getLocation())); } + } else if (expected instanceof UntypedType) { + IntType.getInstance().unify(expected); + type = IntType.getInstance(); + try { + for (int i = 0; i < n.getArgs().length; i++) { + visitExprOrOpArgNode(n.getArgs()[i], type); + } + } catch (TypeErrorException e) { + RealType.getInstance().unify(expected); + type = RealType.getInstance(); + } + } else { + throw new TypeErrorException(String.format("Expected %s, found INTEGER at '%s',%n%s", expected, + n.getOperator().getName(), n.getLocation())); + } + for (int i = 0; i < n.getArgs().length; i++) { + visitExprOrOpArgNode(n.getArgs()[i], type); } + return type; } case B_OPCODE_dotdot: // ..