@@ -35,9 +35,9 @@ type UsedImports = M.Map ModuleName [Name]
35-- or references in an explicit import list.
35-- or references in an explicit import list.
37findUnusedImports :: forall m. (Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) => Module -> Env -> UsedImports -> m ()
37findUnusedImports :: forall m. (Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) => Module -> Env -> UsedImports -> m ()
38−findUnusedImports (Module _ _ _ mdecls _) env usedImps = do
38+findUnusedImports (Module _ _ _ mdecls mexports) env usedImps = do
39 imps <- findImports mdecls
39 imps <- findImports mdecls
40− forM_ (M.toAscList imps) $ \(mni, decls) -> unless (mni `elem` autoIncludes) $
40+ forM_ (M.toAscList imps) $ \(mni, decls) -> unless (mni `elem` alwaysUsedModules) $
41 forM_ decls $ \(ss, declType, qualifierName) -> censor (onErrorMessages $ addModuleLocError ss) $
41 forM_ decls $ \(ss, declType, qualifierName) -> censor (onErrorMessages $ addModuleLocError ss) $
42 let usedNames = mapMaybe (matchName (typeForDCtor mni) qualifierName) $ sugarNames mni ++ M.findWithDefault [] mni usedImps in
42 let usedNames = mapMaybe (matchName (typeForDCtor mni) qualifierName) $ sugarNames mni ++ M.findWithDefault [] mni usedImps in
43 case declType of
43 case declType of
@@ -52,8 +52,12 @@ findUnusedImports (Module _ _ _ mdecls _) env usedImps = do
52 sugarNames (ModuleName [ProperName n]) | n == C.prelude = [ IdentName $ Qualified Nothing (Ident C.bind) ]
52 sugarNames (ModuleName [ProperName n]) | n == C.prelude = [ IdentName $ Qualified Nothing (Ident C.bind) ]
53 sugarNames _ = []
53 sugarNames _ = []
55+ -- rely on exports being elaborated by this point
55− autoIncludes :: [ ModuleName ]
56+ alwaysUsedModules :: [ ModuleName ]
56− autoIncludes = [ ModuleName [ProperName C.prim] ]
57+ alwaysUsedModules = ModuleName [ProperName C.prim] : maybe [] (mapMaybe isExport) mexports
59+ isExport (ModuleRef mn) = Just mn
58 typeForDCtor :: ModuleName -> ProperName -> Maybe ProperName
62 typeForDCtor :: ModuleName -> ProperName -> Maybe ProperName
59 typeForDCtor mn pn =
63 typeForDCtor mn pn =