diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2019-11-19 16:52:02 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2019-12-10 11:44:59 +0000 |
commit | 247258022d2ec2bffcd414e9fe02d82d4bb6e6c7 (patch) | |
tree | 983adb56f5f520e1e605c91ff9b8b73542151c0b | |
parent | 1b63f576940e9d77b3028c324a419ac4d30c4e63 (diff) | |
download | haskell-247258022d2ec2bffcd414e9fe02d82d4bb6e6c7.tar.gz |
Fix flattening of FunTy
-rw-r--r-- | compiler/typecheck/TcFlatten.hs | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/compiler/typecheck/TcFlatten.hs b/compiler/typecheck/TcFlatten.hs index b8b210d5de..fe5d44827b 100644 --- a/compiler/typecheck/TcFlatten.hs +++ b/compiler/typecheck/TcFlatten.hs @@ -1172,11 +1172,34 @@ flatten_one (TyConApp tc tys) = flatten_ty_con_app tc tys flatten_one ty@(FunTy _ ty1 ty2) - = do { (xi1,co1) <- flatten_one ty1 - ; (xi2,co2) <- flatten_one ty2 + = do { (xi1, co1) <- flatten_one ty1 + ; (_, kco1) <- noBogusCoercions $ flatten_one (typeKind xi1) + ; (xi2, co2) <- flatten_one ty2 + ; (_, kco2) <- noBogusCoercions $ flatten_one (typeKind xi2) ; role <- getRole - ; return (ty { ft_arg = xi1, ft_res = xi2 } - , mkFunCo role co1 co2) } + ; let sym_kco1 = mkTcSymCo kco1 + sym_kco2 = mkTcSymCo kco2 + co1' = co1 `mkTcTransCo` mkGReflRightCo role xi1 sym_kco1 + ; let co2' = co2 `mkTcTransCo` mkGReflRightCo role xi2 sym_kco2 + ; return (ty { ft_arg = xi1 `mkTcCastTy` sym_kco1 + , ft_res = xi2 `mkTcCastTy` sym_kco2 } + , mkSymCo (mkFunCo role co1' co2')) } + -- This is a specialised version of the cleverness in flatten_ty_con_app + -- Input: (ty1 -> ty2) + -- co1 :: xi1 ~ ty1 + -- co2 :: xi2 ~ ty2 + -- kco1 :: kxi1 ~ kind(xi1) + -- kco2 :: kxi2 ~ kind(xi2) + -- res_ty = (xi1 |> sym kco1) -> (xi2 |> sym kco2) + -- res_co :: ty ~ res_ty = mkFunCo co1' co2' + -- co1' :: ty1 ~ (xi1 |> sym kco1) + -- = co1 ; grefl1 + -- grefl1 :: xi1 ~ (xi1 |> sym kco1) + -- = Grefl xi1 (MCo kco1) + -- co2' :: ty2 ~ (xi2 |> sym kco2) + -- grefl2 :: xi2 ~ (xi1 |> sym kco2) + -- = Grefl xi2 (MCo kco2) + -- Result: (res_ty, sym res_co) flatten_one ty@(ForAllTy {}) -- TODO (RAE): This is inadequate, as it doesn't flatten the kind of @@ -1194,7 +1217,7 @@ flatten_one ty@(ForAllTy {}) flatten_one (CastTy ty g) = do { (xi, co) <- flatten_one ty - ; (g', _) <- flatten_co g + ; (g', _) <- flatten_co g ; role <- getRole ; return (mkCastTy xi g', castCoercionKind co role xi ty g' g) } @@ -1592,7 +1615,8 @@ flattenTyVar tv FTRNotFollowed -- Done, but make sure the kind is zonked -- Note [Flattening] invariant (F0) and (F1) - -> do { tv' <- liftTcS $ updateTyVarKindM zonkTcType tv + -> do { -- tv' <- liftTcS $ updateTyVarKindM zonkTcType tv + let tv' = tv ; role <- getRole ; let ty' = mkTyVarTy tv' ; return (ty', mkTcReflCo role ty') } } |