diff --git a/ghc/compiler/typecheck/TcBinds.lhs b/ghc/compiler/typecheck/TcBinds.lhs index 6f62328f3861bcd9eca4050b6ece428f6a2f6fd7..49dfed223b5da9abd6e0eb8c6a0c77bca469ad18 100644 --- a/ghc/compiler/typecheck/TcBinds.lhs +++ b/ghc/compiler/typecheck/TcBinds.lhs @@ -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_`