[project @ 1999-02-09 08:53:05 by simonpj]
authorsimonpj <unknown>
Tue, 9 Feb 1999 08:53:05 +0000 (08:53 +0000)
committersimonpj <unknown>
Tue, 9 Feb 1999 08:53:05 +0000 (08:53 +0000)
Fix typechecker bug so that

main :: a
main = error "Urk"

gives a sensible error message rather than crashing the compiler

ghc/compiler/typecheck/TcBinds.lhs

index 6f62328..49dfed2 100644 (file)
@@ -692,17 +692,24 @@ now (ToDo).
 \begin{code}
 checkSigMatch top_lvl binder_names mono_ids sigs
   | main_bound_here
-  = mapTc check_one_sig sigs                   `thenTc_`
-    mapTc check_main_ctxt sigs                 `thenTc_` 
-
-       -- Now unify the main_id with IO t, for any old t
+  =    -- First unify the main_id with IO t, for any old t
     tcSetErrCtxt mainTyCheckCtxt (
        tcLookupTyCon ioTyCon_NAME              `thenTc`    \ ioTyCon ->
        newTyVarTy boxedTypeKind                `thenNF_Tc` \ t_tv ->
        unifyTauTy ((mkTyConApp ioTyCon [t_tv]))
                   (idType main_mono_id)
     )                                          `thenTc_`
-    returnTc (Just ([], emptyLIE))
+
+       -- Now check the signatures
+       -- Must do this after the unification with IO t, 
+       -- in case of a silly signature like
+       --      main :: forall a. a
+       -- The unification to IO t will bind the type variable 'a',
+       -- which is just waht check_one_sig looks for
+    mapTc check_one_sig sigs                   `thenTc_`
+    mapTc check_main_ctxt sigs                 `thenTc_` 
+
+           returnTc (Just ([], emptyLIE))
 
   | not (null sigs)
   = mapTc check_one_sig sigs                   `thenTc_`