| EIf (e1, e2, e3) =>
let
- val t = (newUnif (), loc)
-
val t1 = checkExp G e1
val t2 = checkExp G e2
val t3 = checkExp G e3
in
(subTyp (t1, bool))
handle Unify ue =>
- dte (WrongType ("\"If\" test",
+ dte (WrongType ("\"if\" test",
e1,
t1,
bool,
SOME ue));
- subTyp (t2, t);
- (subTyp (t3, t))
- handle Unify ue =>
- dte (WrongType ("\"Else\" case",
- eAll,
- t3,
- t2,
- SOME ue));
- t
+ (subTyp (t2, t3); t3)
+ handle Unify _ =>
+ ((subTyp (t3, t2); t2)
+ handle Unify ue =>
+ (dte (WrongType ("\"else\" case",
+ eAll,
+ t3,
+ t2,
+ SOME ue));
+ (TError, loc)))
end
end