- -- ([a,z,c], [x,y], [a:=:(x,y), c:=:z], T)
-
- = do { (dc_tycon, res_tys) <- tcLHsConResTy res_ty
-
- ; let univ_tvs = choose_univs [] tidy_tc_tvs res_tys
- -- Each univ_tv is either a dc_tv or a tc_tv
+ -- Univ tyvars Eq-spec
+ -- a a~(x,y)
+ -- b b~z
+ -- z
+ -- Existentials are the leftover type vars: [x,y]
+ = do { res_ty' <- tcHsKindedType res_ty
+ ; let Just subst = tcMatchTy (mkVarSet tmpl_tvs) res_tmpl res_ty'
+
+ -- /Lazily/ figure out the univ_tvs etc
+ -- Each univ_tv is either a dc_tv or a tmpl_tv
+ (univ_tvs, eq_spec) = foldr choose ([], []) tidy_tmpl_tvs
+ choose tmpl (univs, eqs)
+ | Just ty <- lookupTyVar subst tmpl
+ = case tcGetTyVar_maybe ty of
+ Just tv | not (tv `elem` univs)
+ -> (tv:univs, eqs)
+ _other -> (tmpl:univs, (tmpl,ty):eqs)
+ | otherwise = pprPanic "tcResultType" (ppr res_ty)