Simon Peyton Jones pushed to branch wip/T20264 at Glasgow Haskell Compiler / GHC
Commits:
-
dde6593d
by Simon Peyton Jones at 2025-04-22T23:42:54+01:00
6 changed files:
- compiler/GHC/CoreToIface.hs
- compiler/GHC/Iface/Ext/Utils.hs
- compiler/GHC/Iface/Rename.hs
- compiler/GHC/Iface/Syntax.hs
- compiler/GHC/Iface/Type.hs
- compiler/GHC/IfaceToCore.hs
Changes:
| ... | ... | @@ -183,7 +183,11 @@ toIfaceTypeX :: VarSet -> Type -> IfaceType |
| 183 | 183 | -- Synonyms are retained in the interface type
|
| 184 | 184 | toIfaceTypeX fr (TyVarTy tv) -- See Note [Free TyVars and CoVars in IfaceType] in GHC.Iface.Type
|
| 185 | 185 | | tv `elemVarSet` fr = IfaceFreeTyVar tv
|
| 186 | + | isExternalName nm = IfaceExtTyVar nm
|
|
| 186 | 187 | | otherwise = IfaceTyVar (toIfaceTyVar tv)
|
| 188 | + where
|
|
| 189 | + nm = tyVarName tv
|
|
| 190 | + |
|
| 187 | 191 | toIfaceTypeX fr ty@(AppTy {}) =
|
| 188 | 192 | -- Flatten as many argument AppTys as possible, then turn them into an
|
| 189 | 193 | -- IfaceAppArgs list.
|
| ... | ... | @@ -164,7 +164,7 @@ hieTypeToIface = foldType go |
| 164 | 164 | where
|
| 165 | 165 | go (HTyVarTy n) = IfaceTyVar $ (mkIfLclName (occNameFS $ getOccName n))
|
| 166 | 166 | go (HAppTy a b) = IfaceAppTy a (hieToIfaceArgs b)
|
| 167 | - go (HLitTy l) = IfaceLitTy l
|
|
| 167 | + go (HLitTy l) = IfaceLitTy l
|
|
| 168 | 168 | go (HForAllTy ((n,k),af) t) = let b = (mkIfLclName (occNameFS $ getOccName n), k)
|
| 169 | 169 | in IfaceForAllTy (Bndr (IfaceTvBndr b) af) t
|
| 170 | 170 | go (HFunTy w a b) = IfaceFunTy visArgTypeLike w a b
|
| ... | ... | @@ -718,7 +718,8 @@ rnIfaceIdDetails details |
| 718 | 718 | |
| 719 | 719 | rnIfaceType :: Rename IfaceType
|
| 720 | 720 | rnIfaceType (IfaceFreeTyVar n) = pure (IfaceFreeTyVar n)
|
| 721 | -rnIfaceType (IfaceTyVar n) = pure (IfaceTyVar n)
|
|
| 721 | +rnIfaceType (IfaceExtTyVar n) = pure (IfaceExtTyVar n)
|
|
| 722 | +rnIfaceType (IfaceTyVar n) = pure (IfaceTyVar n)
|
|
| 722 | 723 | rnIfaceType (IfaceAppTy t1 t2)
|
| 723 | 724 | = IfaceAppTy <$> rnIfaceType t1 <*> rnIfaceAppArgs t2
|
| 724 | 725 | rnIfaceType (IfaceLitTy l) = return (IfaceLitTy l)
|
| ... | ... | @@ -2068,8 +2068,9 @@ freeNamesIfAppArgs (IA_Arg t _ ts) = freeNamesIfType t &&& freeNamesIfAppArgs ts |
| 2068 | 2068 | freeNamesIfAppArgs IA_Nil = emptyNameSet
|
| 2069 | 2069 | |
| 2070 | 2070 | freeNamesIfType :: IfaceType -> NameSet
|
| 2071 | -freeNamesIfType (IfaceFreeTyVar _) = emptyNameSet
|
|
| 2072 | -freeNamesIfType (IfaceTyVar _) = emptyNameSet
|
|
| 2071 | +freeNamesIfType (IfaceFreeTyVar {}) = emptyNameSet
|
|
| 2072 | +freeNamesIfType (IfaceTyVar {}) = emptyNameSet
|
|
| 2073 | +freeNamesIfType (IfaceExtTyVar {}) = emptyNameSet
|
|
| 2073 | 2074 | freeNamesIfType (IfaceAppTy s t) = freeNamesIfType s &&& freeNamesIfAppArgs t
|
| 2074 | 2075 | freeNamesIfType (IfaceTyConApp tc ts) = freeNamesIfTc tc &&& freeNamesIfAppArgs ts
|
| 2075 | 2076 | freeNamesIfType (IfaceTupleTy _ _ ts) = freeNamesIfAppArgs ts
|
| ... | ... | @@ -177,6 +177,7 @@ type IfaceKind = IfaceType |
| 177 | 177 | data IfaceType
|
| 178 | 178 | = IfaceFreeTyVar TyVar -- See Note [Free TyVars and CoVars in IfaceType]
|
| 179 | 179 | | IfaceTyVar IfLclName -- Type/coercion variable only, not tycon
|
| 180 | + | IfaceExtTyVar IfExtName -- Imported or top-level external tyvar
|
|
| 180 | 181 | | IfaceLitTy IfaceTyLit
|
| 181 | 182 | | IfaceAppTy IfaceType IfaceAppArgs
|
| 182 | 183 | -- See Note [Suppressing invisible arguments] for
|
| ... | ... | @@ -701,6 +702,7 @@ ifTypeIsVarFree :: IfaceType -> Bool |
| 701 | 702 | ifTypeIsVarFree ty = go ty
|
| 702 | 703 | where
|
| 703 | 704 | go (IfaceTyVar {}) = False
|
| 705 | + go (IfaceExtTyVar {}) = False
|
|
| 704 | 706 | go (IfaceFreeTyVar {}) = False
|
| 705 | 707 | go (IfaceAppTy fun args) = go fun && go_args args
|
| 706 | 708 | go (IfaceFunTy _ w arg res) = go w && go arg && go res
|
| ... | ... | @@ -723,6 +725,7 @@ visibleTypeVarOccurencies = go |
| 723 | 725 | (<>) = Set.union
|
| 724 | 726 | |
| 725 | 727 | go (IfaceTyVar var) = Set.singleton var
|
| 728 | + go (IfaceExtTyVar {}) = mempty
|
|
| 726 | 729 | go (IfaceFreeTyVar {}) = mempty
|
| 727 | 730 | go (IfaceAppTy fun args) = go fun <> go_args args
|
| 728 | 731 | go (IfaceFunTy _ w arg res) = go w <> go arg <> go res
|
| ... | ... | @@ -758,7 +761,8 @@ substIfaceType :: IfaceTySubst -> IfaceType -> IfaceType |
| 758 | 761 | substIfaceType env ty
|
| 759 | 762 | = go ty
|
| 760 | 763 | where
|
| 761 | - go (IfaceFreeTyVar tv) = IfaceFreeTyVar tv
|
|
| 764 | + go ty@(IfaceFreeTyVar tv) = ty
|
|
| 765 | + go ty@(IfaceExtTyVar tv) = ty
|
|
| 762 | 766 | go (IfaceTyVar tv) = substIfaceTyVar env tv
|
| 763 | 767 | go (IfaceAppTy t ts) = IfaceAppTy (go t) (substIfaceAppArgs env ts)
|
| 764 | 768 | go (IfaceFunTy af w t1 t2) = IfaceFunTy af (go w) (go t1) (go t2)
|
| ... | ... | @@ -1143,8 +1147,9 @@ ppr_ty :: PprPrec -> IfaceType -> SDoc |
| 1143 | 1147 | ppr_ty ctxt_prec ty
|
| 1144 | 1148 | | not (isIfaceRhoType ty) = ppr_sigma ShowForAllMust ctxt_prec ty
|
| 1145 | 1149 | ppr_ty _ (IfaceForAllTy {}) = panic "ppr_ty" -- Covered by not.isIfaceRhoType
|
| 1146 | -ppr_ty _ (IfaceFreeTyVar tyvar) = ppr tyvar -- This is the main reason for IfaceFreeTyVar!
|
|
| 1147 | -ppr_ty _ (IfaceTyVar tyvar) = ppr tyvar -- See Note [Free TyVars and CoVars in IfaceType]
|
|
| 1150 | +ppr_ty _ (IfaceFreeTyVar tyvar) = ppr tyvar -- This is the main reason for IfaceFreeTyVar!
|
|
| 1151 | +ppr_ty _ (IfaceTyVar tyvar) = ppr tyvar -- See Note [Free TyVars and CoVars in IfaceType]
|
|
| 1152 | +ppr_ty _ (IfaceExtTyVar tyvar) = ppr tyvar
|
|
| 1148 | 1153 | ppr_ty ctxt_prec (IfaceTyConApp tc tys) = pprTyTcApp ctxt_prec tc tys
|
| 1149 | 1154 | ppr_ty ctxt_prec (IfaceTupleTy i p tys) = ppr_tuple ctxt_prec i p tys -- always fully saturated
|
| 1150 | 1155 | ppr_ty _ (IfaceLitTy n) = pprIfaceTyLit n
|
| ... | ... | @@ -1320,7 +1325,7 @@ defaultIfaceTyVarsOfKind def_rep def_mult ty = go emptyFsEnv True ty |
| 1320 | 1325 | = IfaceForAllTy (go_ifacebndr subs bndr) (go subs rank1 ty)
|
| 1321 | 1326 | |
| 1322 | 1327 | go subs _ ty@(IfaceTyVar tv) = case lookupFsEnv subs (ifLclNameFS tv) of
|
| 1323 | - Just s -> s
|
|
| 1328 | + Just s -> s
|
|
| 1324 | 1329 | Nothing -> ty
|
| 1325 | 1330 | |
| 1326 | 1331 | go _ _ ty@(IfaceFreeTyVar tv)
|
| ... | ... | @@ -1343,6 +1348,8 @@ defaultIfaceTyVarsOfKind def_rep def_mult ty = go emptyFsEnv True ty |
| 1343 | 1348 | | otherwise
|
| 1344 | 1349 | = ty
|
| 1345 | 1350 | |
| 1351 | + go _ _ ty@(IfaceExtTyVar {}) = ty
|
|
| 1352 | + |
|
| 1346 | 1353 | go subs _ (IfaceTyConApp tc tc_args)
|
| 1347 | 1354 | = IfaceTyConApp tc (go_args subs tc_args)
|
| 1348 | 1355 | |
| ... | ... | @@ -2366,6 +2373,9 @@ putIfaceType bh (IfaceTupleTy s i tys) |
| 2366 | 2373 | = do { putByte bh 8; put_ bh s; put_ bh i; put_ bh tys }
|
| 2367 | 2374 | putIfaceType bh (IfaceLitTy n)
|
| 2368 | 2375 | = do { putByte bh 9; put_ bh n }
|
| 2376 | +putIfaceType bh (IfaceExtTyVar tv) = do
|
|
| 2377 | + putByte bh 10
|
|
| 2378 | + put_ bh tv
|
|
| 2369 | 2379 | |
| 2370 | 2380 | -- | Deserialises an 'IfaceType' from the given 'ReadBinHandle'.
|
| 2371 | 2381 | --
|
| ... | ... | @@ -2397,8 +2407,10 @@ getIfaceType bh = do |
| 2397 | 2407 | |
| 2398 | 2408 | 8 -> do { s <- get bh; i <- get bh; tys <- get bh
|
| 2399 | 2409 | ; return (IfaceTupleTy s i tys) }
|
| 2400 | - _ -> do n <- get bh
|
|
| 2410 | + 9 -> do n <- get bh
|
|
| 2401 | 2411 | return (IfaceLitTy n)
|
| 2412 | + _ -> do n <- get bh
|
|
| 2413 | + return (IfaceExtTyVar n)
|
|
| 2402 | 2414 | |
| 2403 | 2415 | instance Binary IfLclName where
|
| 2404 | 2416 | put_ bh = put_ bh . ifLclNameFS
|
| ... | ... | @@ -2586,6 +2598,7 @@ instance NFData IfaceType where |
| 2586 | 2598 | rnf = \case
|
| 2587 | 2599 | IfaceFreeTyVar f1 -> f1 `seq` ()
|
| 2588 | 2600 | IfaceTyVar f1 -> rnf f1
|
| 2601 | + IfaceExtTyVar f1 -> rnf f1
|
|
| 2589 | 2602 | IfaceLitTy f1 -> rnf f1
|
| 2590 | 2603 | IfaceAppTy f1 f2 -> rnf f1 `seq` rnf f2
|
| 2591 | 2604 | IfaceFunTy f1 f2 f3 f4 -> rnf f1 `seq` rnf f2 `seq` rnf f3 `seq` rnf f4
|
| ... | ... | @@ -1502,6 +1502,7 @@ tcIfaceType :: IfaceType -> IfL Type |
| 1502 | 1502 | tcIfaceType = go
|
| 1503 | 1503 | where
|
| 1504 | 1504 | go (IfaceTyVar n) = TyVarTy <$> tcIfaceTyVar n
|
| 1505 | + go (IfaceExtTyVar n) = TyVarTy <$> tcIfaceExtTyVar n
|
|
| 1505 | 1506 | go (IfaceFreeTyVar n) = pprPanic "tcIfaceType:IfaceFreeTyVar" (ppr n)
|
| 1506 | 1507 | go (IfaceLitTy l) = LitTy <$> tcIfaceTyLit l
|
| 1507 | 1508 | go (IfaceFunTy flag w t1 t2) = FunTy flag <$> tcIfaceType w <*> go t1 <*> go t2
|
| ... | ... | @@ -2144,6 +2145,13 @@ tcIfaceGlobal name |
| 2144 | 2145 | -- the constructor (A and B) means that GHC will always typecheck
|
| 2145 | 2146 | -- this expression *after* typechecking T.
|
| 2146 | 2147 | |
| 2148 | +tcIfaceExtTyVar :: Name -> IfL TyVar
|
|
| 2149 | +tcIfaceExtTyVar name
|
|
| 2150 | + = do { thing <- tcIfaceGlobal name
|
|
| 2151 | + ; case thing of
|
|
| 2152 | + ATyVar tv -> return tv
|
|
| 2153 | + _ -> pprPanic "tcIfaceExtTyVar" (ppr thing) }
|
|
| 2154 | + |
|
| 2147 | 2155 | tcIfaceTyCon :: IfaceTyCon -> IfL TyCon
|
| 2148 | 2156 | tcIfaceTyCon (IfaceTyCon name _info)
|
| 2149 | 2157 | = do { thing <- tcIfaceGlobal name
|