From 5dd916543a04bd22de43c242cb0a0c14aafc90f3 Mon Sep 17 00:00:00 2001
From: simonpj <unknown>
Date: Thu, 9 Nov 2000 08:18:12 +0000
Subject: [PATCH] [project @ 2000-11-09 08:18:11 by simonpj] Make data
 constructors visible in unfoldings

---
 ghc/compiler/main/MkIface.lhs       |  6 +++---
 ghc/compiler/rename/Rename.lhs      |  4 +---
 ghc/compiler/rename/RnHiFiles.lhs   | 12 ++++++++++--
 ghc/compiler/rename/RnIfaces.lhs    | 19 +++++++++++++++----
 ghc/compiler/rename/RnMonad.lhs     |  7 +++----
 ghc/compiler/typecheck/TcModule.lhs | 20 +++++++++-----------
 6 files changed, 41 insertions(+), 27 deletions(-)

diff --git a/ghc/compiler/main/MkIface.lhs b/ghc/compiler/main/MkIface.lhs
index adf89db91481..fb1e504c43d0 100644
--- a/ghc/compiler/main/MkIface.lhs
+++ b/ghc/compiler/main/MkIface.lhs
@@ -47,7 +47,7 @@ import Name		( isLocallyDefined, getName,
 import Name 	-- Env
 import OccName		( pprOccName )
 import TyCon		( TyCon, getSynTyConDefn, isSynTyCon, isNewTyCon, isAlgTyCon,
-			  tyConTheta, tyConTyVars, tyConDataCons, tyConFamilySize
+			  tyConTheta, tyConTyVars, tyConDataCons, tyConFamilySize, isClassTyCon
 			)
 import Class		( classExtraBigSig, DefMeth(..) )
 import FieldLabel	( fieldLabelType )
@@ -176,8 +176,8 @@ ifaceTyCls (AClass clas) so_far
 			 DefMeth id -> DefMeth (getName id)
 
 ifaceTyCls (ATyCon tycon) so_far
-  = ty_decl : so_far
-  
+  | isClassTyCon tycon = so_far
+  | otherwise	       = ty_decl : so_far
   where
     ty_decl | isSynTyCon tycon
 	    = TySynonym (getName tycon)(toHsTyVars tyvars) 
diff --git a/ghc/compiler/rename/Rename.lhs b/ghc/compiler/rename/Rename.lhs
index 023145c8a353..3900bb30df91 100644
--- a/ghc/compiler/rename/Rename.lhs
+++ b/ghc/compiler/rename/Rename.lhs
@@ -523,9 +523,7 @@ reportUnusedNames my_mod_iface imports avail_env
     warnUnusedImports bad_imp_names				`thenRn_`
     printMinimalImports this_mod minimal_imports		`thenRn_`
     warnDeprecations this_mod export_avails my_deprecs 
-		     really_used_names				`thenRn_`
-    traceRn (text "Used" <+> fsep (map ppr (nameSetToList used_names)))	`thenRn_`
-    returnRn ()
+		     really_used_names
 
   where
     this_mod   = mi_module my_mod_iface
diff --git a/ghc/compiler/rename/RnHiFiles.lhs b/ghc/compiler/rename/RnHiFiles.lhs
index 20c6ece840f7..bb16c9f19d53 100644
--- a/ghc/compiler/rename/RnHiFiles.lhs
+++ b/ghc/compiler/rename/RnHiFiles.lhs
@@ -111,8 +111,16 @@ tryLoadInterface doc_str mod_name from
 	
 	-- CHECK WHETHER WE HAVE IT ALREADY
    case lookupIfaceByModName hit pit mod_name of {
-	Just iface  -> returnRn (iface, Nothing) ;	-- Already loaded
-	Nothing	    -> 
+	Just iface |  case from of
+			ImportByUser	   -> not (mi_boot iface)
+			ImportByUserSource -> mi_boot iface
+			ImportBySystem 	   -> True
+		   -> returnRn (iface, Nothing) ;	-- Already loaded
+			-- The not (mi_boot iface) test checks that the already-loaded
+			-- interface isn't a boot iface.  This can conceivably happen,
+			-- if the version checking happened to load a boot interface
+			-- before we got to real imports.  
+	other	    -> 
 
    let
 	mod_map  = iImpModInfo ifaces
diff --git a/ghc/compiler/rename/RnIfaces.lhs b/ghc/compiler/rename/RnIfaces.lhs
index 43e3cd9b01b5..797e1804a003 100644
--- a/ghc/compiler/rename/RnIfaces.lhs
+++ b/ghc/compiler/rename/RnIfaces.lhs
@@ -710,8 +710,21 @@ checkModUsage (mod_name, _, _, NothingAtAll)
 	-- In this case we don't even want to open Foo's interface.
   = up_to_date (ptext SLIT("Nothing used from:") <+> ppr mod_name)
 
-checkModUsage (mod_name, _, _, whats_imported)
-  = tryLoadInterface doc_str mod_name ImportBySystem	`thenRn` \ (iface, maybe_err) ->
+checkModUsage (mod_name, _, is_boot, whats_imported)
+  = 	-- Load the imported interface is possible
+	-- We use tryLoadInterface, because failure is not an error
+	-- (might just be that the old .hi file for this module is out of date)
+	-- We use ImportByUser/ImportByUserSource as the 'from' flag, 
+	-- 	a) because we need to know whether to load the .hi-boot file
+	--	b) because loadInterface things matters are amiss if we 
+	--	   ImportBySystem an interface it knows nothing about
+    let
+    	doc_str = sep [ptext SLIT("need version info for"), ppr mod_name]
+    	from    | is_boot   = ImportByUserSource
+	    	| otherwise = ImportByUser
+    in
+    tryLoadInterface doc_str mod_name from	`thenRn` \ (iface, maybe_err) ->
+
     case maybe_err of {
 	Just err -> out_of_date (sep [ptext SLIT("Can't find version number for module"), 
 				      ppr mod_name]) ;
@@ -758,8 +771,6 @@ checkModUsage (mod_name, _, _, whats_imported)
 	up_to_date (ptext SLIT("...but the bits I use haven't."))
 
     }}
-  where
-    doc_str = sep [ptext SLIT("need version info for"), ppr mod_name]
 
 ------------------------
 checkModuleVersion old_mod_vers new_vers
diff --git a/ghc/compiler/rename/RnMonad.lhs b/ghc/compiler/rename/RnMonad.lhs
index edb98f867737..0b96e1668ae3 100644
--- a/ghc/compiler/rename/RnMonad.lhs
+++ b/ghc/compiler/rename/RnMonad.lhs
@@ -264,10 +264,9 @@ data Ifaces = Ifaces {
     -- EPHEMERAL FIELDS
     -- These fields persist during the compilation of a single module only
 	iImpModInfo :: ImportedModuleInfo,
-			-- Modules this one depends on: that is, the union 
-			-- of the modules its *direct* imports depend on.
-			-- NB: The direct imports have .hi files that enumerate *all* the
-			-- dependencies (direct or not) of the imported module.
+			-- Modules that we know something about, because they are mentioned
+			-- in interface files, BUT which we have not loaded yet.  
+			-- No module is both in here and in the PIT
 
 	iSlurp :: NameSet,
 		-- All the names (whether "big" or "small", whether wired-in or not,
diff --git a/ghc/compiler/typecheck/TcModule.lhs b/ghc/compiler/typecheck/TcModule.lhs
index ec9847976667..65257fdcf722 100644
--- a/ghc/compiler/typecheck/TcModule.lhs
+++ b/ghc/compiler/typecheck/TcModule.lhs
@@ -43,17 +43,16 @@ import Bag		( isEmptyBag )
 import ErrUtils		( printErrorsAndWarnings, dumpIfSet_dyn )
 import Id		( idType, idUnfolding )
 import Module           ( Module )
-import Name		( Name, isLocallyDefined, toRdrName )
+import Name		( Name, toRdrName )
 import Name		( nameEnvElts, lookupNameEnv )
 import TyCon		( tyConGenInfo )
-import Maybes		( thenMaybe )
 import Util
 import BasicTypes       ( EP(..), Fixity )
 import Bag		( isEmptyBag )
 import Outputable
-import HscTypes		( PersistentCompilerState(..), HomeSymbolTable, HomeIfaceTable,
+import HscTypes		( PersistentCompilerState(..), HomeSymbolTable, 
 			  PackageTypeEnv, DFunId, ModIface(..),
-			  TypeEnv, extendTypeEnvList, lookupIface,
+			  TypeEnv, extendTypeEnvList, 
 		          TyThing(..), mkTypeEnv )
 import List		( partition )
 \end{code}
@@ -106,7 +105,6 @@ typecheckModule dflags this_mod pcs hst mod_iface decls
     tc_module :: TcM (RecTcEnv, TcResults)
     tc_module = fixTc (\ ~(unf_env ,_) -> tcModule pcs hst get_fixity this_mod decls unf_env)
 
-    pit        = pcs_PIT pcs
     fixity_env = mi_fixities mod_iface
 
     get_fixity :: Name -> Maybe Fixity
@@ -160,7 +158,6 @@ tcModule pcs hst get_fixity this_mod decls unf_env
     -- imported
     tcInterfaceSigs unf_env decls		`thenTc` \ sig_ids ->
     tcExtendGlobalValEnv sig_ids		$
-    tcGetEnv					`thenTc` \ unf_env ->
     
     -- Create any necessary record selector Ids and their bindings
     -- "Necessary" includes data and newtype declarations
@@ -179,6 +176,7 @@ tcModule pcs hst get_fixity this_mod decls unf_env
     --	    will find they aren't there and complain.
     tcExtendGlobalValEnv data_ids		$
     tcExtendGlobalValEnv cls_ids		$
+    tcGetEnv					`thenTc` \ unf_env ->
     
         -- Foreign import declarations next
     tcForeignImports decls			`thenTc`    \ (fo_ids, foi_decls) ->
@@ -285,19 +283,19 @@ dump_sigs results	-- Print type signatures
   = 	-- Convert to HsType so that we get source-language style printing
 	-- And sort by RdrName
     vcat $ map ppr_sig $ sortLt lt_sig $
-    [(toRdrName id, toHsType (idType id))
-        | AnId id <- nameEnvElts (tc_env results), 
-          want_sig id
+    [ (toRdrName id, toHsType (idType id))
+    | AnId id <- nameEnvElts (tc_env results),
+      want_sig id
     ]
   where
     lt_sig (n1,_) (n2,_) = n1 < n2
     ppr_sig (n,t)        = ppr n <+> dcolon <+> ppr t
 
     want_sig id | opt_PprStyle_Debug = True
-	        | otherwise	     = isLocallyDefined id
+	        | otherwise	     = True	-- For now
 
 ppr_gen_tycons tcs = vcat [ptext SLIT("{-# Generic type constructor details"),
-			   vcat (map ppr_gen_tycon (filter isLocallyDefined tcs)),
+			   vcat (map ppr_gen_tycon tcs),
 		   	   ptext SLIT("#-}")
 		     ]
 
-- 
GitLab