Simon Peyton Jones pushed to branch wip/T20264 at Glasgow Haskell Compiler / GHC

Commits:

6 changed files:

Changes:

  • compiler/GHC/CoreToIface.hs
    ... ... @@ -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.
    

  • compiler/GHC/Iface/Ext/Utils.hs
    ... ... @@ -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
    

  • compiler/GHC/Iface/Rename.hs
    ... ... @@ -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)
    

  • compiler/GHC/Iface/Syntax.hs
    ... ... @@ -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
    

  • compiler/GHC/Iface/Type.hs
    ... ... @@ -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
    

  • compiler/GHC/IfaceToCore.hs
    ... ... @@ -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