-kcTyDecl :: RenamedTyClDecl -> TcM s ()
-
-kcTyDecl (TySynonym name tyvar_names rhs src_loc)
- = tcLookupTy name `thenNF_Tc` \ (kind, _, _) ->
- tcExtendTopTyVarScope kind tyvar_names $ \ _ result_kind ->
- tcHsTypeKind rhs `thenTc` \ (rhs_kind, _) ->
- unifyKind result_kind rhs_kind
-
-kcTyDecl (TyData _ context tycon_name tyvar_names con_decls _ _ src_loc)
- = tcLookupTy tycon_name `thenNF_Tc` \ (kind, _, _) ->
- tcExtendTopTyVarScope kind tyvar_names $ \ result_kind _ ->
- tcContext context `thenTc_`
- mapTc kcConDecl con_decls `thenTc_`
- returnTc ()
-
-kcConDecl (ConDecl _ ex_tvs ex_ctxt details loc)
- = tcAddSrcLoc loc (
- tcExtendTyVarScope ex_tvs ( \ tyvars ->
- tcContext ex_ctxt `thenTc_`
- kc_con details `thenTc_`
- returnTc ()
- ))
+tcTyDecl1 :: RenamedTyClDecl -> TcM s (Name, TyThingDetails)
+tcTyDecl1 (TySynonym tycon_name tyvar_names rhs src_loc)
+ = tcLookupTy tycon_name `thenNF_Tc` \ (ATyCon tycon) ->
+ tcExtendTyVarEnv (tyConTyVars tycon) $
+ tcHsType rhs `thenTc` \ rhs_ty ->
+ -- Note tcHsType not tcHsSigType; we allow type synonyms
+ -- that aren't types; e.g. type List = []
+ --
+ -- If the RHS mentions tyvars that aren't in scope, we'll
+ -- quantify over them:
+ -- e.g. type T = a->a
+ -- will become type T = forall a. a->a
+ --
+ -- With gla-exts that's right, but for H98 we should complain.
+ -- We can now do that here without falling into
+ -- a black hole, we still do it in rnDecl (TySynonym case)
+
+ returnTc (tycon_name, SynTyDetails rhs_ty)
+
+tcTyDecl1 (TyData new_or_data context tycon_name _ con_decls _ derivings _ src_loc)
+ = tcLookupTy tycon_name `thenNF_Tc` \ (ATyCon tycon) ->
+ let
+ tyvars = tyConTyVars tycon
+ in
+ tcExtendTyVarEnv tyvars $
+
+ -- Typecheck the pieces
+ tcClassContext context `thenTc` \ ctxt ->
+ tc_derivs derivings `thenTc` \ derived_classes ->
+ mapTc (tcConDecl new_or_data tycon tyvars ctxt) con_decls `thenTc` \ data_cons ->
+
+ returnTc (tycon_name, DataTyDetails ctxt data_cons derived_classes)