X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/469e60eb4974bf3fc47cfa5b9a33b14983bec135..e63d3705454c62fd1eff1c0c9cd78f042e621fbc:/type/typechecker.sml diff --git a/type/typechecker.sml b/type/typechecker.sml index 8be3731..3191979 100644 --- a/type/typechecker.sml +++ b/type/typechecker.sml @@ -24,6 +24,9 @@ struct of A.Var a => (case Symbol.look vars a of NONE => (ErrorMsg.error mark ("variable `"^(Symbol.name a)^"' not declared here") ; raise ErrorMsg.Error) | SOME t => t) + | A.Cast (ty, e') => if (T.issmall ty) andalso (T.issmall (typeof (tds, funcs) vars mark e')) + then ty + else (ErrorMsg.error mark ("cannot cast: one of `"^(T.Print.pp_type ty)^"' or `"^(T.Print.pp_type (typeof (tds, funcs) vars mark e))^"' was not small"); raise ErrorMsg.Error) | A.ConstExp _ => T.Int | A.StringExp _ => T.String | A.OpExp (A.EQ, [a, b]) => @@ -207,6 +210,7 @@ struct | SOME UNASSIGNED => ( ErrorMsg.error mark ("usage of unassigned variable `" ^ Symbol.name v ^ "'") ; raise ErrorMsg.Error ) | SOME ASSIGNED => ()) + | varcheck_exp env (A.Cast (ty, e)) mark = varcheck_exp env e mark | varcheck_exp env (A.ConstExp _) mark = () | varcheck_exp env (A.StringExp _) mark = () | varcheck_exp env (A.OpExp (_, l)) mark = List.app (fn znt => varcheck_exp env znt mark) l