* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*)
+ *)
(* Domtool configuration language type checking *)
TUnif (_, ref (SOME tAll)) => whnorm tAll
| _ => tAll
+fun hasTyp (e, t1, t2) =
+ case whnorm t2 of
+ (TBase name, _) =>
+ (case typeRule name of
+ NONE => subTyp (t1, t2)
+ | SOME rule =>
+ if rule e then
+ ()
+ else
+ subTyp (t1, t2))
+ | _ => subTyp (t1, t2)
+
fun checkTyp G (tAll as (t, loc)) =
let
val err = ErrorMsg.error (SOME loc)
let
val t' = checkExp G e'
in
- (subTyp (t', t);
+ (hasTyp (eAll, t', t);
if isError t' then
(TList (TError, loc), loc)
else
val tf = checkExp G func
val ta = checkExp G arg
in
- (subTyp (tf, (TArrow (dom, ran), loc));
- subTyp (ta, dom)
+ (hasTyp (func, tf, (TArrow (dom, ran), loc));
+ hasTyp (arg, ta, dom)
handle Unify ue =>
dte (WrongType ("Function argument",
arg,
val t = checkExp G e
in
- subTyp (t, to)
+ hasTyp (e, t, to)
handle Unify ue =>
describe_type_error loc
(WrongType ("Bound value",
let
val t = checkExp G' e
in
- subTyp (t, tInit)
+ hasTyp (e, t, tInit)
handle Unify ue =>
(ErrorMsg.error (SOME loc) "Bad type for final expression of source file.";
preface ("Actual:", p_typ t);