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
|