Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1931

ghc-ghc-devel-6.12.3-5.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>iface/TcIface.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%

Type checking of type signatures in interface files

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>TcIface</span> <span class='hs-layout'>(</span> 
<a name="line-2"></a>	<span class='hs-varid'>tcImportDecl</span><span class='hs-layout'>,</span> <span class='hs-varid'>checkWiredInTyCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcHiBootIface</span><span class='hs-layout'>,</span> <span class='hs-varid'>typecheckIface</span><span class='hs-layout'>,</span> 
<a name="line-3"></a>	<span class='hs-varid'>tcIfaceDecl</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcIfaceInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcIfaceFamInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcIfaceRules</span><span class='hs-layout'>,</span>
<a name="line-4"></a>	<span class='hs-varid'>tcIfaceVectInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcIfaceAnnotations</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcIfaceGlobal</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcExtCoreBindings</span>
<a name="line-5"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>IfaceSyn</span>
<a name="line-10"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>LoadIface</span>
<a name="line-11"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>IfaceEnv</span>
<a name="line-12"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BuildTyCl</span>
<a name="line-13"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcRnMonad</span>
<a name="line-14"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Type</span>
<a name="line-15"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TypeRep</span>
<a name="line-16"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HscTypes</span>
<a name="line-17"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Annotations</span>
<a name="line-18"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>InstEnv</span>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FamInstEnv</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreSyn</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreUtils</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreUnfold</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreLint</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>WorkWrap</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Id</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>MkId</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>IdInfo</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysWiredIn</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span>              <span class='hs-layout'>(</span> <span class='hs-conid'>TyVar</span> <span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Var</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>VarEnv</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameEnv</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Module</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>LazyUniqFM</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSupply</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>	
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ErrUtils</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Maybes</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DynFlags</span>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span> <span class='hs-layout'>(</span><span class='hs-conid'>Arity</span><span class='hs-layout'>)</span>
<a name="line-48"></a>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
</pre>\end{code}

This module takes

	IfaceDecl -> TyThing
	IfaceType -> Type
	etc

An IfaceDecl is populated with RdrNames, and these are not renamed to
Names before typechecking, because there should be no scope errors etc.

	-- For (b) consider: f = \$(...h....)
	-- where h is imported, and calls f via an hi-boot file.  
	-- This is bad!  But it is not seen as a staging error, because h
	-- is indeed imported.  We don't want the type-checker to black-hole 
	-- when simplifying and compiling the splice!
	--
	-- Simple solution: discard any unfolding that mentions a variable
	-- bound in this module (and hence not yet processed).
	-- The discarding happens when forkM finds a type error.

%************************************************************************
%*									*
%*	tcImportDecl is the key function for "faulting in" 		*
%*	imported things
%*									*
%************************************************************************

The main idea is this.  We are chugging along type-checking source code, and
find a reference to GHC.Base.map.  We call tcLookupGlobal, which doesn't find
it in the EPS type envt.  So it 
	1 loads GHC.Base.hi
	2 gets the decl for GHC.Base.map
	3 typechecks it via tcIfaceDecl
	4 and adds it to the type env in the EPS

Note that DURING STEP 4, we may find that map's type mentions a type 
constructor that also 

Notice that for imported things we read the current version from the EPS
mutable variable.  This is important in situations like
	...$(e1)...$(e2)...
where the code that e1 expands to might import some defns that 
also turn out to be needed by the code that e2 expands to.

\begin{code}
<pre><a name="line-1"></a><a name="tcImportDecl"></a><span class='hs-definition'>tcImportDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TyThing</span>
<a name="line-2"></a><span class='hs-comment'>-- Entry point for *source-code* uses of importDecl</span>
<a name="line-3"></a><span class='hs-definition'>tcImportDecl</span> <span class='hs-varid'>name</span> 
<a name="line-4"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>wiredInNameTyThing_maybe</span> <span class='hs-varid'>name</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>needWiredInHomeIface</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span>
<a name="line-6"></a>    	       <span class='hs-layout'>(</span><span class='hs-varid'>initIfaceTcRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>loadWiredInHomeIface</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-7"></a>		<span class='hs-comment'>-- See Note [Loading instances for wired-in things]</span>
<a name="line-8"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>thing</span> <span class='hs-layout'>}</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>traceIf</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"tcImportDecl"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-11"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>mb_thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>initIfaceTcRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>importDecl</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-12"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_thing</span> <span class='hs-keyword'>of</span>
<a name="line-13"></a>	    <span class='hs-conid'>Succeeded</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>thing</span>
<a name="line-14"></a>	    <span class='hs-conid'>Failed</span> <span class='hs-varid'>err</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-varid'>err</span> <span class='hs-layout'>}</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="importDecl"></a><span class='hs-definition'>importDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfM</span> <span class='hs-varid'>lcl</span> <span class='hs-layout'>(</span><span class='hs-conid'>MaybeErr</span> <span class='hs-conid'>Message</span> <span class='hs-conid'>TyThing</span><span class='hs-layout'>)</span>
<a name="line-17"></a><span class='hs-comment'>-- Get the TyThing for this Name from an interface file</span>
<a name="line-18"></a><span class='hs-comment'>-- It's not a wired-in thing -- the caller caught that</span>
<a name="line-19"></a><span class='hs-definition'>importDecl</span> <span class='hs-varid'>name</span>
<a name="line-20"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isWiredInName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-21"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>traceIf</span> <span class='hs-varid'>nd_doc</span>
<a name="line-22"></a>
<a name="line-23"></a>	<span class='hs-comment'>-- Load the interface, which should populate the PTE</span>
<a name="line-24"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>mb_iface</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>isExternalName</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span> <span class='hs-layout'>)</span> 
<a name="line-25"></a>	  	      <span class='hs-varid'>loadInterface</span> <span class='hs-varid'>nd_doc</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameModule</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-conid'>ImportBySystem</span>
<a name="line-26"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_iface</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-27"></a>		<span class='hs-conid'>Failed</span> <span class='hs-varid'>err_msg</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Failed</span> <span class='hs-varid'>err_msg</span><span class='hs-layout'>)</span> <span class='hs-layout'>;</span>
<a name="line-28"></a>		<span class='hs-conid'>Succeeded</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-29"></a>
<a name="line-30"></a>	<span class='hs-comment'>-- Now look it up again; this time we should find it</span>
<a name="line-31"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getEps</span>	
<a name="line-32"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupTypeEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>eps_PTE</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>of</span>
<a name="line-33"></a>	    <span class='hs-conid'>Just</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Succeeded</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span>
<a name="line-34"></a>	    <span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Failed</span> <span class='hs-varid'>not_found_msg</span><span class='hs-layout'>)</span>
<a name="line-35"></a>    <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-36"></a>  <span class='hs-keyword'>where</span>
<a name="line-37"></a>    <span class='hs-varid'>nd_doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Need decl for"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span>
<a name="line-38"></a>    <span class='hs-varid'>not_found_msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Can't find interface-file declaration for"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span>
<a name="line-39"></a>				<span class='hs-varid'>pprNameSpace</span> <span class='hs-layout'>(</span><span class='hs-varid'>occNameSpace</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-40"></a>	  	       <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Probable cause: bug in .hi-boot file, or inconsistent .hi file"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-41"></a>		                <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Use -ddump-if-trace to get an idea of which file caused the error"</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
           Checks for wired-in things
%*									*
%************************************************************************

Note [Loading instances for wired-in things]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We need to make sure that we have at least *read* the interface files
for any module with an instance decl or RULE that we might want.  

* If the instance decl is an orphan, we have a whole separate mechanism
  (loadOprhanModules)

* If the instance decl not an orphan, then the act of looking at the
  TyCon or Class will force in the defining module for the
  TyCon/Class, and hence the instance decl

* BUT, if the TyCon is a wired-in TyCon, we don't really need its interface;
  but we must make sure we read its interface in case it has instances or
  rules.  That is what LoadIface.loadWiredInHomeInterface does.  It's called
  from TcIface.{tcImportDecl, checkWiredInTyCon, ifCheckWiredInThing}

* HOWEVER, only do this for TyCons.  There are no wired-in Classes.  There
  are some wired-in Ids, but we don't want to load their interfaces. For
  example, Control.Exception.Base.recSelError is wired in, but that module
  is compiled late in the base library, and we don't want to force it to
  load before it's been compiled!

All of this is done by the type checker. The renamer plays no role.
(It used to, but no longer.)


\begin{code}
<pre><a name="line-1"></a><a name="checkWiredInTyCon"></a><span class='hs-definition'>checkWiredInTyCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>()</span>
<a name="line-2"></a><span class='hs-comment'>-- Ensure that the home module of the TyCon (and hence its instances)</span>
<a name="line-3"></a><span class='hs-comment'>-- are loaded. See Note [Loading instances for wired-in things]</span>
<a name="line-4"></a><span class='hs-comment'>-- It might not be a wired-in tycon (see the calls in TcUnify),</span>
<a name="line-5"></a><span class='hs-comment'>-- in which case this is a no-op.</span>
<a name="line-6"></a><span class='hs-definition'>checkWiredInTyCon</span> <span class='hs-varid'>tc</span>	
<a name="line-7"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isWiredInName</span> <span class='hs-varid'>tc_name</span><span class='hs-layout'>)</span> 
<a name="line-8"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>mod</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getModule</span>
<a name="line-11"></a>	<span class='hs-layout'>;</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>isExternalName</span> <span class='hs-varid'>tc_name</span> <span class='hs-layout'>)</span> 
<a name="line-12"></a>	  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>mod</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>nameModule</span> <span class='hs-varid'>tc_name</span><span class='hs-layout'>)</span>
<a name="line-13"></a>	       <span class='hs-layout'>(</span><span class='hs-varid'>initIfaceTcRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>loadWiredInHomeIface</span> <span class='hs-varid'>tc_name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-14"></a>		<span class='hs-comment'>-- Don't look for (non-existent) Float.hi when</span>
<a name="line-15"></a>		<span class='hs-comment'>-- compiling Float.lhs, which mentions Float of course</span>
<a name="line-16"></a>	  	<span class='hs-comment'>-- A bit yukky to call initIfaceTcRn here</span>
<a name="line-17"></a>	<span class='hs-layout'>}</span>
<a name="line-18"></a>  <span class='hs-keyword'>where</span>
<a name="line-19"></a>    <span class='hs-varid'>tc_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyConName</span> <span class='hs-varid'>tc</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="ifCheckWiredInThing"></a><span class='hs-definition'>ifCheckWiredInThing</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>()</span>
<a name="line-22"></a><span class='hs-comment'>-- Even though we are in an interface file, we want to make</span>
<a name="line-23"></a><span class='hs-comment'>-- sure the instances of a wired-in thing are loaded (imagine f :: Double -&gt; Double)</span>
<a name="line-24"></a><span class='hs-comment'>-- Ditto want to ensure that RULES are loaded too</span>
<a name="line-25"></a><span class='hs-comment'>-- See Note [Loading instances for wired-in things]</span>
<a name="line-26"></a><span class='hs-definition'>ifCheckWiredInThing</span> <span class='hs-varid'>thing</span>
<a name="line-27"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>mod</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getIfModule</span>
<a name="line-28"></a>		<span class='hs-comment'>-- Check whether we are typechecking the interface for this</span>
<a name="line-29"></a>		<span class='hs-comment'>-- very module.  E.g when compiling the base library in --make mode</span>
<a name="line-30"></a>		<span class='hs-comment'>-- we may typecheck GHC.Base.hi. At that point, GHC.Base is not in</span>
<a name="line-31"></a>		<span class='hs-comment'>-- the HPT, so without the test we'll demand-load it into the PIT!</span>
<a name="line-32"></a>		<span class='hs-comment'>-- C.f. the same test in checkWiredInTyCon above</span>
<a name="line-33"></a>        <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getName</span> <span class='hs-varid'>thing</span>
<a name="line-34"></a>	<span class='hs-layout'>;</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>isExternalName</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span> <span class='hs-layout'>)</span> 
<a name="line-35"></a>	  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>needWiredInHomeIface</span> <span class='hs-varid'>thing</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>mod</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>nameModule</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-36"></a>	       <span class='hs-layout'>(</span><span class='hs-varid'>loadWiredInHomeIface</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="needWiredInHomeIface"></a><span class='hs-definition'>needWiredInHomeIface</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-39"></a><span class='hs-comment'>-- Only for TyCons; see Note [Loading instances for wired-in things]</span>
<a name="line-40"></a><span class='hs-definition'>needWiredInHomeIface</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-41"></a><span class='hs-definition'>needWiredInHomeIface</span> <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
</pre>\end{code}

%************************************************************************
%*									*
		Type-checking a complete interface
%*									*
%************************************************************************

Suppose we discover we don't need to recompile.  Then we must type
check the old interface file.  This is a bit different to the
incremental type checking we do as we suck in interface files.  Instead
we do things similarly as when we are typechecking source decls: we
bring into scope the type envt for the interface all at once, using a
knot.  Remember, the decls aren't necessarily in dependency order --
and even if they were, the type decls might be mutually recursive.

\begin{code}
<pre><a name="line-1"></a><a name="typecheckIface"></a><span class='hs-definition'>typecheckIface</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModIface</span> 	<span class='hs-comment'>-- Get the decls from here</span>
<a name="line-2"></a>	       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRnIf</span> <span class='hs-varid'>gbl</span> <span class='hs-varid'>lcl</span> <span class='hs-conid'>ModDetails</span>
<a name="line-3"></a><span class='hs-definition'>typecheckIface</span> <span class='hs-varid'>iface</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>initIfaceTc</span> <span class='hs-varid'>iface</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tc_env_var</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-5"></a>	<span class='hs-comment'>-- The tc_env_var is freshly allocated, private to </span>
<a name="line-6"></a>	<span class='hs-comment'>-- type-checking this particular interface</span>
<a name="line-7"></a>	<span class='hs-layout'>{</span> 	<span class='hs-comment'>-- Get the right set of decls and rules.  If we are compiling without -O</span>
<a name="line-8"></a>		<span class='hs-comment'>-- we discard pragmas before typechecking, so that we don't "see"</span>
<a name="line-9"></a>		<span class='hs-comment'>-- information that we shouldn't.  From a versioning point of view</span>
<a name="line-10"></a>		<span class='hs-comment'>-- It's not actually *wrong* to do so, but in fact GHCi is unable </span>
<a name="line-11"></a>		<span class='hs-comment'>-- to handle unboxed tuples, so it must not see unfoldings.</span>
<a name="line-12"></a>	  <span class='hs-varid'>ignore_prags</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doptM</span> <span class='hs-conid'>Opt_IgnoreInterfacePragmas</span>
<a name="line-13"></a>
<a name="line-14"></a>		<span class='hs-comment'>-- Typecheck the decls.  This is done lazily, so that the knot-tying</span>
<a name="line-15"></a>		<span class='hs-comment'>-- within this single module work out right.  In the If monad there is</span>
<a name="line-16"></a>		<span class='hs-comment'>-- no global envt for the current interface; instead, the knot is tied</span>
<a name="line-17"></a>		<span class='hs-comment'>-- through the if_rec_types field of IfGblEnv</span>
<a name="line-18"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>names_w_things</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>loadDecls</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-layout'>(</span><span class='hs-varid'>mi_decls</span> <span class='hs-varid'>iface</span><span class='hs-layout'>)</span>
<a name="line-19"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>type_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNameEnv</span> <span class='hs-varid'>names_w_things</span>
<a name="line-20"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>writeMutVar</span> <span class='hs-varid'>tc_env_var</span> <span class='hs-varid'>type_env</span>
<a name="line-21"></a>
<a name="line-22"></a>		<span class='hs-comment'>-- Now do those rules, instances and annotations</span>
<a name="line-23"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>insts</span>     <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceInst</span>    <span class='hs-layout'>(</span><span class='hs-varid'>mi_insts</span>     <span class='hs-varid'>iface</span><span class='hs-layout'>)</span>
<a name="line-24"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>fam_insts</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceFamInst</span> <span class='hs-layout'>(</span><span class='hs-varid'>mi_fam_insts</span> <span class='hs-varid'>iface</span><span class='hs-layout'>)</span>
<a name="line-25"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>rules</span>     <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceRules</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-layout'>(</span><span class='hs-varid'>mi_rules</span> <span class='hs-varid'>iface</span><span class='hs-layout'>)</span>
<a name="line-26"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>anns</span>      <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceAnnotations</span>  <span class='hs-layout'>(</span><span class='hs-varid'>mi_anns</span> <span class='hs-varid'>iface</span><span class='hs-layout'>)</span>
<a name="line-27"></a>
<a name="line-28"></a>                <span class='hs-comment'>-- Vectorisation information</span>
<a name="line-29"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>vect_info</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceVectInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>mi_module</span> <span class='hs-varid'>iface</span><span class='hs-layout'>)</span> <span class='hs-varid'>type_env</span> 
<a name="line-30"></a>                                       <span class='hs-layout'>(</span><span class='hs-varid'>mi_vect_info</span> <span class='hs-varid'>iface</span><span class='hs-layout'>)</span>
<a name="line-31"></a>
<a name="line-32"></a>		<span class='hs-comment'>-- Exports</span>
<a name="line-33"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>exports</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ifaceExportNames</span> <span class='hs-layout'>(</span><span class='hs-varid'>mi_exports</span> <span class='hs-varid'>iface</span><span class='hs-layout'>)</span>
<a name="line-34"></a>
<a name="line-35"></a>		<span class='hs-comment'>-- Finished</span>
<a name="line-36"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>traceIf</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"Finished typechecking interface for"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>mi_module</span> <span class='hs-varid'>iface</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-37"></a>			 <span class='hs-varid'>text</span> <span class='hs-str'>"Type envt:"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>type_env</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-38"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>ModDetails</span> <span class='hs-layout'>{</span> <span class='hs-varid'>md_types</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>type_env</span>
<a name="line-39"></a>			      <span class='hs-layout'>,</span> <span class='hs-varid'>md_insts</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insts</span>
<a name="line-40"></a>			      <span class='hs-layout'>,</span> <span class='hs-varid'>md_fam_insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fam_insts</span>
<a name="line-41"></a>			      <span class='hs-layout'>,</span> <span class='hs-varid'>md_rules</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rules</span>
<a name="line-42"></a>			      <span class='hs-layout'>,</span> <span class='hs-varid'>md_anns</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>anns</span>
<a name="line-43"></a>                              <span class='hs-layout'>,</span> <span class='hs-varid'>md_vect_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vect_info</span>
<a name="line-44"></a>			      <span class='hs-layout'>,</span> <span class='hs-varid'>md_exports</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exports</span>
<a name="line-45"></a>			      <span class='hs-layout'>}</span>
<a name="line-46"></a>    <span class='hs-layout'>}</span>
</pre>\end{code}


%************************************************************************
%*									*
		Type and class declarations
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcHiBootIface"></a><span class='hs-definition'>tcHiBootIface</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscSource</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Module</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-conid'>ModDetails</span>
<a name="line-2"></a><span class='hs-comment'>-- Load the hi-boot iface for the module being compiled,</span>
<a name="line-3"></a><span class='hs-comment'>-- if it indeed exists in the transitive closure of imports</span>
<a name="line-4"></a><span class='hs-comment'>-- Return the ModDetails, empty if no hi-boot iface</span>
<a name="line-5"></a><span class='hs-definition'>tcHiBootIface</span> <span class='hs-varid'>hsc_src</span> <span class='hs-varid'>mod</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isHsBoot</span> <span class='hs-varid'>hsc_src</span>		<span class='hs-comment'>-- Already compiling a hs-boot file</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>emptyModDetails</span>
<a name="line-8"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>traceIf</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"loadHiBootInterface"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span>
<a name="line-10"></a>
<a name="line-11"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>mode</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getGhcMode</span>
<a name="line-12"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isOneShot</span> <span class='hs-varid'>mode</span><span class='hs-layout'>)</span>
<a name="line-13"></a>		<span class='hs-comment'>-- In --make and interactive mode, if this module has an hs-boot file</span>
<a name="line-14"></a>		<span class='hs-comment'>-- we'll have compiled it already, and it'll be in the HPT</span>
<a name="line-15"></a>		<span class='hs-comment'>-- </span>
<a name="line-16"></a>		<span class='hs-comment'>-- We check wheher the interface is a *boot* interface.</span>
<a name="line-17"></a>		<span class='hs-comment'>-- It can happen (when using GHC from Visual Studio) that we</span>
<a name="line-18"></a>		<span class='hs-comment'>-- compile a module in TypecheckOnly mode, with a stable, </span>
<a name="line-19"></a>		<span class='hs-comment'>-- fully-populated HPT.  In that case the boot interface isn't there</span>
<a name="line-20"></a>		<span class='hs-comment'>-- (it's been replaced by the mother module) so we can't check it.</span>
<a name="line-21"></a>		<span class='hs-comment'>-- And that's fine, because if M's ModInfo is in the HPT, then </span>
<a name="line-22"></a>		<span class='hs-comment'>-- it's been compiled once, and we don't need to check the boot iface</span>
<a name="line-23"></a>	  <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>hpt</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getHpt</span>
<a name="line-24"></a>		  <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupUFM</span> <span class='hs-varid'>hpt</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-25"></a>		      <span class='hs-conid'>Just</span> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>mi_boot</span> <span class='hs-layout'>(</span><span class='hs-varid'>hm_iface</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span> 
<a name="line-26"></a>				<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>hm_details</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>
<a name="line-27"></a>		      <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>emptyModDetails</span> <span class='hs-layout'>}</span>
<a name="line-28"></a>	  <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-29"></a>
<a name="line-30"></a>	<span class='hs-comment'>-- OK, so we're in one-shot mode.  </span>
<a name="line-31"></a>	<span class='hs-comment'>-- In that case, we're read all the direct imports by now, </span>
<a name="line-32"></a>	<span class='hs-comment'>-- so eps_is_boot will record if any of our imports mention us by </span>
<a name="line-33"></a>	<span class='hs-comment'>-- way of hi-boot file</span>
<a name="line-34"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getEps</span>
<a name="line-35"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupUFM</span> <span class='hs-layout'>(</span><span class='hs-varid'>eps_is_boot</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-36"></a>	    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>emptyModDetails</span> <span class='hs-layout'>;</span>	<span class='hs-comment'>-- The typical case</span>
<a name="line-37"></a>
<a name="line-38"></a>	    <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-varid'>moduleLoop</span> <span class='hs-layout'>;</span>
<a name="line-39"></a> 		<span class='hs-comment'>-- Someone below us imported us!</span>
<a name="line-40"></a>		<span class='hs-comment'>-- This is a loop with no hi-boot in the way</span>
<a name="line-41"></a>		
<a name="line-42"></a>	    <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-sel'>_mod</span><span class='hs-layout'>,</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> 	<span class='hs-comment'>-- There's a hi-boot interface below us</span>
<a name="line-43"></a>		
<a name="line-44"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>read_result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>findAndReadIface</span> 
<a name="line-45"></a>				<span class='hs-varid'>need</span> <span class='hs-varid'>mod</span>
<a name="line-46"></a>				<span class='hs-conid'>True</span>	<span class='hs-comment'>-- Hi-boot file</span>
<a name="line-47"></a>
<a name="line-48"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>read_result</span> <span class='hs-keyword'>of</span>
<a name="line-49"></a>		<span class='hs-conid'>Failed</span> <span class='hs-varid'>err</span>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>elaborate</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-50"></a>		<span class='hs-conid'>Succeeded</span> <span class='hs-layout'>(</span><span class='hs-varid'>iface</span><span class='hs-layout'>,</span> <span class='hs-sel'>_path</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>typecheckIface</span> <span class='hs-varid'>iface</span>
<a name="line-51"></a>    <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-52"></a>  <span class='hs-keyword'>where</span>
<a name="line-53"></a>    <span class='hs-varid'>need</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Need the hi-boot interface for"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>mod</span>
<a name="line-54"></a>		 <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"to compare against the Real Thing"</span><span class='hs-layout'>)</span>
<a name="line-55"></a>
<a name="line-56"></a>    <span class='hs-varid'>moduleLoop</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Circular imports: module"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span> 
<a name="line-57"></a>		     <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"depends on itself"</span><span class='hs-layout'>)</span>
<a name="line-58"></a>
<a name="line-59"></a>    <span class='hs-varid'>elaborate</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Could not find hi-boot interface for"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-60"></a>		          <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>colon</span><span class='hs-layout'>)</span> <span class='hs-num'>4</span> <span class='hs-varid'>err</span>
</pre>\end{code}


%************************************************************************
%*									*
		Type and class declarations
%*									*
%************************************************************************

When typechecking a data type decl, we *lazily* (via forkM) typecheck
the constructor argument types.  This is in the hope that we may never
poke on those argument types, and hence may never need to load the
interface files for types mentioned in the arg types.

E.g.	
	data Foo.S = MkS Baz.T
Mabye we can get away without even loading the interface for Baz!

This is not just a performance thing.  Suppose we have
	data Foo.S = MkS Baz.T
	data Baz.T = MkT Foo.S
(in different interface files, of course).
Now, first we load and typecheck Foo.S, and add it to the type envt.  
If we do explore MkS's argument, we'll load and typecheck Baz.T.
If we explore MkT's argument we'll find Foo.S already in the envt.  

If we typechecked constructor args eagerly, when loading Foo.S we'd try to
typecheck the type Baz.T.  So we'd fault in Baz.T... and then need Foo.S...
which isn't done yet.

All very cunning. However, there is a rather subtle gotcha which bit
me when developing this stuff.  When we typecheck the decl for S, we
extend the type envt with S, MkS, and all its implicit Ids.  Suppose
(a bug, but it happened) that the list of implicit Ids depended in
turn on the constructor arg types.  Then the following sequence of
events takes place:
	* we build a thunk <t> for the constructor arg tys
	* we build a thunk for the extended type environment (depends on <t>)
	* we write the extended type envt into the global EPS mutvar
	
Now we look something up in the type envt
	* that pulls on <t>
	* which reads the global type envt out of the global EPS mutvar
	* but that depends in turn on <t>

It's subtle, because, it'd work fine if we typechecked the constructor args 
eagerly -- they don't need the extended type envt.  They just get the extended
type envt by accident, because they look at it later.

What this means is that the implicitTyThings MUST NOT DEPEND on any of
the forkM stuff.


\begin{code}
<pre><a name="line-1"></a><a name="tcIfaceDecl"></a><span class='hs-definition'>tcIfaceDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>	<span class='hs-comment'>-- True &lt;=&gt; discard IdInfo on IfaceId bindings</span>
<a name="line-2"></a>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfaceDecl</span>
<a name="line-3"></a>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>TyThing</span>
<a name="line-4"></a>
<a name="line-5"></a><span class='hs-definition'>tcIfaceDecl</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceId</span> <span class='hs-layout'>{</span><span class='hs-varid'>ifName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occ_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifType</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>iface_type</span><span class='hs-layout'>,</span> 
<a name="line-6"></a> 	    		 	   <span class='hs-varid'>ifIdDetails</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>details</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>occ_name</span>
<a name="line-8"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>iface_type</span>
<a name="line-9"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>details</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIdDetails</span> <span class='hs-varid'>details</span>
<a name="line-10"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIdInfo</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span>
<a name="line-11"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnId</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkGlobalId</span> <span class='hs-varid'>details</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-12"></a>
<a name="line-13"></a><span class='hs-definition'>tcIfaceDecl</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceData</span> <span class='hs-layout'>{</span><span class='hs-varid'>ifName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occ_name</span><span class='hs-layout'>,</span> 
<a name="line-14"></a>			  <span class='hs-varid'>ifTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tv_bndrs</span><span class='hs-layout'>,</span> 
<a name="line-15"></a>			  <span class='hs-varid'>ifCtxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ctxt</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifGadtSyntax</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>gadt_syn</span><span class='hs-layout'>,</span>
<a name="line-16"></a>			  <span class='hs-varid'>ifCons</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rdr_cons</span><span class='hs-layout'>,</span> 
<a name="line-17"></a>			  <span class='hs-varid'>ifRec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>is_rec</span><span class='hs-layout'>,</span> 
<a name="line-18"></a>			  <span class='hs-varid'>ifGeneric</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>want_generic</span><span class='hs-layout'>,</span>
<a name="line-19"></a>			  <span class='hs-varid'>ifFamInst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_family</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-20"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceTyVars_AT</span> <span class='hs-varid'>tv_bndrs</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tyvars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-21"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>tc_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>occ_name</span>
<a name="line-22"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>tycon</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fixM</span> <span class='hs-layout'>(</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tycon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-23"></a>	    <span class='hs-layout'>{</span> <span class='hs-varid'>stupid_theta</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceCtxt</span> <span class='hs-varid'>ctxt</span>
<a name="line-24"></a>	    <span class='hs-layout'>;</span> <span class='hs-varid'>mb_fam_inst</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcFamInst</span> <span class='hs-varid'>mb_family</span>
<a name="line-25"></a>	    <span class='hs-layout'>;</span> <span class='hs-varid'>cons</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceDataCons</span> <span class='hs-varid'>tc_name</span> <span class='hs-varid'>tycon</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>rdr_cons</span>
<a name="line-26"></a>	    <span class='hs-layout'>;</span> <span class='hs-varid'>buildAlgTyCon</span> <span class='hs-varid'>tc_name</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>stupid_theta</span>
<a name="line-27"></a>			    <span class='hs-varid'>cons</span> <span class='hs-varid'>is_rec</span> <span class='hs-varid'>want_generic</span> <span class='hs-varid'>gadt_syn</span> <span class='hs-varid'>mb_fam_inst</span>
<a name="line-28"></a>	    <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-29"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>traceIf</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"tcIfaceDecl4"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span>
<a name="line-30"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-definition'>tcIfaceDecl</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceSyn</span> <span class='hs-layout'>{</span><span class='hs-varid'>ifName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occ_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tv_bndrs</span><span class='hs-layout'>,</span> 
<a name="line-33"></a>		         <span class='hs-varid'>ifSynRhs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_rhs_ty</span><span class='hs-layout'>,</span>
<a name="line-34"></a>		         <span class='hs-varid'>ifSynKind</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kind</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifFamInst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_family</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-35"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceTyVars_AT</span> <span class='hs-varid'>tv_bndrs</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tyvars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-36"></a>     <span class='hs-layout'>{</span> <span class='hs-varid'>tc_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>occ_name</span>
<a name="line-37"></a>     <span class='hs-layout'>;</span> <span class='hs-varid'>rhs_kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>kind</span>	<span class='hs-comment'>-- Note [Synonym kind loop]</span>
<a name="line-38"></a>     <span class='hs-layout'>;</span> <span class='hs-keyglyph'>~</span><span class='hs-layout'>(</span><span class='hs-varid'>rhs</span><span class='hs-layout'>,</span> <span class='hs-varid'>fam</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>forkM</span> <span class='hs-layout'>(</span><span class='hs-varid'>mk_doc</span> <span class='hs-varid'>tc_name</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> 
<a name="line-39"></a>       	      	      <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>rhs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tc_syn_rhs</span> <span class='hs-varid'>rhs_kind</span> <span class='hs-varid'>mb_rhs_ty</span>
<a name="line-40"></a>			 <span class='hs-layout'>;</span> <span class='hs-varid'>fam</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcFamInst</span> <span class='hs-varid'>mb_family</span>
<a name="line-41"></a>			 <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>rhs</span><span class='hs-layout'>,</span> <span class='hs-varid'>fam</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-42"></a>     <span class='hs-layout'>;</span> <span class='hs-varid'>tycon</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>buildSynTyCon</span> <span class='hs-varid'>tc_name</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>rhs</span> <span class='hs-varid'>rhs_kind</span> <span class='hs-varid'>fam</span>
<a name="line-43"></a>     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tycon</span>
<a name="line-44"></a>     <span class='hs-layout'>}</span>
<a name="line-45"></a>   <span class='hs-keyword'>where</span>
<a name="line-46"></a>     <span class='hs-varid'>mk_doc</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Type syonym"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span>
<a name="line-47"></a>     <span class='hs-varid'>tc_syn_rhs</span> <span class='hs-varid'>kind</span> <span class='hs-conid'>Nothing</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>OpenSynTyCon</span> <span class='hs-varid'>kind</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-48"></a>     <span class='hs-varid'>tc_syn_rhs</span> <span class='hs-keyword'>_</span>    <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>rhs_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>ty</span>
<a name="line-49"></a>		   		    <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>SynonymTyCon</span> <span class='hs-varid'>rhs_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-50"></a>
<a name="line-51"></a><span class='hs-definition'>tcIfaceDecl</span> <span class='hs-varid'>ignore_prags</span>
<a name="line-52"></a>	    <span class='hs-layout'>(</span><span class='hs-conid'>IfaceClass</span> <span class='hs-layout'>{</span><span class='hs-varid'>ifCtxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rdr_ctxt</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occ_name</span><span class='hs-layout'>,</span> 
<a name="line-53"></a>			 <span class='hs-varid'>ifTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tv_bndrs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifFDs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rdr_fds</span><span class='hs-layout'>,</span> 
<a name="line-54"></a>			 <span class='hs-varid'>ifATs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rdr_ats</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifSigs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rdr_sigs</span><span class='hs-layout'>,</span> 
<a name="line-55"></a>			 <span class='hs-varid'>ifRec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tc_isrec</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-56"></a><span class='hs-comment'>-- ToDo: in hs-boot files we should really treat abstract classes specially,</span>
<a name="line-57"></a><span class='hs-comment'>--	 as we do abstract tycons</span>
<a name="line-58"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceTyVars</span> <span class='hs-varid'>tv_bndrs</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tyvars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-59"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>cls_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>occ_name</span>
<a name="line-60"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>ctxt</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceCtxt</span> <span class='hs-varid'>rdr_ctxt</span>
<a name="line-61"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>sigs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tc_sig</span> <span class='hs-varid'>rdr_sigs</span>
<a name="line-62"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>fds</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tc_fd</span> <span class='hs-varid'>rdr_fds</span>
<a name="line-63"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>ats'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcIfaceDecl</span> <span class='hs-varid'>ignore_prags</span><span class='hs-layout'>)</span> <span class='hs-varid'>rdr_ats</span>
<a name="line-64"></a>    <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>ats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>setAssocFamilyPermutation</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>)</span> <span class='hs-varid'>ats'</span>
<a name="line-65"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>cls</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>buildClass</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-varid'>cls_name</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>fds</span> <span class='hs-varid'>ats</span> <span class='hs-varid'>sigs</span> <span class='hs-varid'>tc_isrec</span>
<a name="line-66"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>AClass</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-67"></a>  <span class='hs-keyword'>where</span>
<a name="line-68"></a>   <span class='hs-varid'>tc_sig</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceClassOp</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>dm</span> <span class='hs-varid'>rdr_ty</span><span class='hs-layout'>)</span>
<a name="line-69"></a>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>op_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>occ</span>
<a name="line-70"></a>	  <span class='hs-layout'>;</span> <span class='hs-varid'>op_ty</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>forkM</span> <span class='hs-layout'>(</span><span class='hs-varid'>mk_doc</span> <span class='hs-varid'>op_name</span> <span class='hs-varid'>rdr_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>rdr_ty</span><span class='hs-layout'>)</span>
<a name="line-71"></a>		<span class='hs-comment'>-- Must be done lazily for just the same reason as the </span>
<a name="line-72"></a>		<span class='hs-comment'>-- type of a data con; to avoid sucking in types that</span>
<a name="line-73"></a>		<span class='hs-comment'>-- it mentions unless it's necessray to do so</span>
<a name="line-74"></a>	  <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>op_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>dm</span><span class='hs-layout'>,</span> <span class='hs-varid'>op_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-75"></a>
<a name="line-76"></a>   <span class='hs-varid'>mk_doc</span> <span class='hs-varid'>op_name</span> <span class='hs-varid'>op_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Class op"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>op_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>op_ty</span><span class='hs-keyglyph'>]</span>
<a name="line-77"></a>
<a name="line-78"></a>   <span class='hs-varid'>tc_fd</span> <span class='hs-layout'>(</span><span class='hs-varid'>tvs1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tvs2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tvs1'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceTyVar</span> <span class='hs-varid'>tvs1</span>
<a name="line-79"></a>			   <span class='hs-layout'>;</span> <span class='hs-varid'>tvs2'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceTyVar</span> <span class='hs-varid'>tvs2</span>
<a name="line-80"></a>			   <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tvs1'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tvs2'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-81"></a>
<a name="line-82"></a><span class='hs-definition'>tcIfaceDecl</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceForeign</span> <span class='hs-layout'>{</span><span class='hs-varid'>ifName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rdr_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifExtName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ext_name</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-83"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>rdr_name</span>
<a name="line-84"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkForeignTyCon</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ext_name</span> 
<a name="line-85"></a>					 <span class='hs-varid'>liftedTypeKind</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-86"></a>
<a name="line-87"></a><a name="tcFamInst"></a><span class='hs-definition'>tcFamInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTyCon</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceType</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-88"></a><span class='hs-definition'>tcFamInst</span> <span class='hs-conid'>Nothing</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-89"></a><span class='hs-definition'>tcFamInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>fam</span><span class='hs-layout'>,</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>famTyCon</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceTyCon</span> <span class='hs-varid'>fam</span>
<a name="line-90"></a>      	    			 <span class='hs-layout'>;</span> <span class='hs-varid'>insttys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>tys</span>
<a name="line-91"></a>       	    			 <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>famTyCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>insttys</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-92"></a>
<a name="line-93"></a><a name="tcIfaceDataCons"></a><span class='hs-definition'>tcIfaceDataCons</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfaceConDecls</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>AlgTyConRhs</span>
<a name="line-94"></a><span class='hs-definition'>tcIfaceDataCons</span> <span class='hs-varid'>tycon_name</span> <span class='hs-varid'>tycon</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>if_cons</span>
<a name="line-95"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>if_cons</span> <span class='hs-keyword'>of</span>
<a name="line-96"></a>	<span class='hs-conid'>IfAbstractTyCon</span>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>mkAbstractTyConRhs</span>
<a name="line-97"></a>	<span class='hs-conid'>IfOpenDataTyCon</span>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>mkOpenDataTyConRhs</span>
<a name="line-98"></a>	<span class='hs-conid'>IfDataTyCon</span> <span class='hs-varid'>cons</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>data_cons</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tc_con_decl</span> <span class='hs-varid'>cons</span>
<a name="line-99"></a>				<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkDataTyConRhs</span> <span class='hs-varid'>data_cons</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-100"></a>	<span class='hs-conid'>IfNewTyCon</span> <span class='hs-varid'>con</span>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>data_con</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tc_con_decl</span> <span class='hs-varid'>con</span>
<a name="line-101"></a>				<span class='hs-layout'>;</span> <span class='hs-varid'>mkNewTyConRhs</span> <span class='hs-varid'>tycon_name</span> <span class='hs-varid'>tycon</span> <span class='hs-varid'>data_con</span> <span class='hs-layout'>}</span>
<a name="line-102"></a>  <span class='hs-keyword'>where</span>
<a name="line-103"></a>    <span class='hs-varid'>tc_con_decl</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfCon</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ifConInfix</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>is_infix</span><span class='hs-layout'>,</span> 
<a name="line-104"></a>			 <span class='hs-varid'>ifConUnivTvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>univ_tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifConExTvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ex_tvs</span><span class='hs-layout'>,</span>
<a name="line-105"></a>			 <span class='hs-varid'>ifConOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occ</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifConCtxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ctxt</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifConEqSpec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>spec</span><span class='hs-layout'>,</span>
<a name="line-106"></a>			 <span class='hs-varid'>ifConArgTys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>args</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifConFields</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>field_lbls</span><span class='hs-layout'>,</span>
<a name="line-107"></a>			 <span class='hs-varid'>ifConStricts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>stricts</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-108"></a>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceTyVars</span> <span class='hs-varid'>univ_tvs</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>univ_tyvars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-109"></a>       <span class='hs-varid'>bindIfaceTyVars</span> <span class='hs-varid'>ex_tvs</span>	 <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>ex_tyvars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-110"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>name</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>occ</span>
<a name="line-111"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>eq_spec</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceEqSpec</span> <span class='hs-varid'>spec</span>
<a name="line-112"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>theta</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceCtxt</span> <span class='hs-varid'>ctxt</span>	<span class='hs-comment'>-- Laziness seems not worth the bother here</span>
<a name="line-113"></a>	 	<span class='hs-comment'>-- At one stage I thought that this context checking *had*</span>
<a name="line-114"></a>		<span class='hs-comment'>-- to be lazy, because of possible mutual recursion between the</span>
<a name="line-115"></a>		<span class='hs-comment'>-- type and the classe: </span>
<a name="line-116"></a>		<span class='hs-comment'>-- E.g. </span>
<a name="line-117"></a>		<span class='hs-comment'>--	class Real a where { toRat :: a -&gt; Ratio Integer }</span>
<a name="line-118"></a>		<span class='hs-comment'>--	data (Real a) =&gt; Ratio a = ...</span>
<a name="line-119"></a>		<span class='hs-comment'>-- But now I think that the laziness in checking class ops breaks </span>
<a name="line-120"></a>		<span class='hs-comment'>-- the loop, so no laziness needed</span>
<a name="line-121"></a>
<a name="line-122"></a>	<span class='hs-comment'>-- Read the argument types, but lazily to avoid faulting in</span>
<a name="line-123"></a>	<span class='hs-comment'>-- the component types unless they are really needed</span>
<a name="line-124"></a> 	<span class='hs-layout'>;</span> <span class='hs-varid'>arg_tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>forkM</span> <span class='hs-layout'>(</span><span class='hs-varid'>mk_doc</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-125"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>lbl_names</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>field_lbls</span>
<a name="line-126"></a>
<a name="line-127"></a>	<span class='hs-comment'>-- Remember, tycon is the representation tycon</span>
<a name="line-128"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>orig_res_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkFamilyTyConApp</span> <span class='hs-varid'>tycon</span> 
<a name="line-129"></a>				<span class='hs-layout'>(</span><span class='hs-varid'>substTyVars</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTopTvSubst</span> <span class='hs-varid'>eq_spec</span><span class='hs-layout'>)</span> <span class='hs-varid'>univ_tyvars</span><span class='hs-layout'>)</span>
<a name="line-130"></a>
<a name="line-131"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>buildDataCon</span> <span class='hs-varid'>name</span> <span class='hs-varid'>is_infix</span> <span class='hs-comment'>{- Not infix -}</span>
<a name="line-132"></a>		       <span class='hs-varid'>stricts</span> <span class='hs-varid'>lbl_names</span>
<a name="line-133"></a>		       <span class='hs-varid'>univ_tyvars</span> <span class='hs-varid'>ex_tyvars</span> 
<a name="line-134"></a>                       <span class='hs-varid'>eq_spec</span> <span class='hs-varid'>theta</span> 
<a name="line-135"></a>		       <span class='hs-varid'>arg_tys</span> <span class='hs-varid'>orig_res_ty</span> <span class='hs-varid'>tycon</span>
<a name="line-136"></a>	<span class='hs-layout'>}</span>
<a name="line-137"></a>    <span class='hs-varid'>mk_doc</span> <span class='hs-varid'>con_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Constructor"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>con_name</span>
<a name="line-138"></a>
<a name="line-139"></a><a name="tcIfaceEqSpec"></a><span class='hs-definition'>tcIfaceEqSpec</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span> <span class='hs-conid'>IfaceType</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>TyVar</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-140"></a><span class='hs-definition'>tcIfaceEqSpec</span> <span class='hs-varid'>spec</span>
<a name="line-141"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>do_item</span> <span class='hs-varid'>spec</span>
<a name="line-142"></a>  <span class='hs-keyword'>where</span>
<a name="line-143"></a>    <span class='hs-varid'>do_item</span> <span class='hs-layout'>(</span><span class='hs-varid'>occ</span><span class='hs-layout'>,</span> <span class='hs-varid'>if_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceTyVar</span> <span class='hs-layout'>(</span><span class='hs-varid'>occNameFS</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
<a name="line-144"></a>                              <span class='hs-layout'>;</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>if_ty</span>
<a name="line-145"></a>                              <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tv</span><span class='hs-layout'>,</span><span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code}

Note [Synonym kind loop]
~~~~~~~~~~~~~~~~~~~~~~~~
Notice that we eagerly grab the *kind* from the interface file, but
build a forkM thunk for the *rhs* (and family stuff).  To see why, 
consider this (Trac #2412)

M.hs:       module M where { import X; data T = MkT S }
X.hs:       module X where { import {-# SOURCE #-} M; type S = T }
M.hs-boot:  module M where { data T }

When kind-checking M.hs we need S's kind.  But we do not want to
find S's kind from (typeKind S-rhs), because we don't want to look at
S-rhs yet!  Since S is imported from X.hi, S gets just one chance to
be defined, and we must not do that until we've finished with M.T.

Solution: record S's kind in the interface file; now we can safely
look at it.

%************************************************************************
%*									*
		Instances
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcIfaceInst"></a><span class='hs-definition'>tcIfaceInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceInst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>Instance</span>
<a name="line-2"></a><span class='hs-definition'>tcIfaceInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceInst</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ifDFun</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dfun_occ</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifOFlag</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oflag</span><span class='hs-layout'>,</span>
<a name="line-3"></a>			 <span class='hs-varid'>ifInstCls</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cls</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifInstTys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_tcs</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>dfun</span>    <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>forkM</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Dict fun"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>dfun_occ</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-5"></a>		     <span class='hs-varid'>tcIfaceExtId</span> <span class='hs-varid'>dfun_occ</span>
<a name="line-6"></a>        <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>mb_tcs'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>ifaceTyConName</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_tcs</span>
<a name="line-7"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkImportedInstance</span> <span class='hs-varid'>cls</span> <span class='hs-varid'>mb_tcs'</span> <span class='hs-varid'>dfun</span> <span class='hs-varid'>oflag</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="tcIfaceFamInst"></a><span class='hs-definition'>tcIfaceFamInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceFamInst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>FamInst</span>
<a name="line-10"></a><span class='hs-definition'>tcIfaceFamInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceFamInst</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ifFamInstTyCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> 
<a name="line-11"></a>			       <span class='hs-varid'>ifFamInstFam</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fam</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifFamInstTys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_tcs</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-12"></a><span class='hs-comment'>--	{ tycon'  &lt;- forkM (ptext (sLit "Inst tycon") &lt;+&gt; ppr tycon) $</span>
<a name="line-13"></a><span class='hs-comment'>-- the above line doesn't work, but this below does =&gt; CPP in Haskell = evil!</span>
<a name="line-14"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>tycon'</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>forkM</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-str'>"Inst tycon"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-15"></a>                    <span class='hs-varid'>tcIfaceTyCon</span> <span class='hs-varid'>tycon</span>
<a name="line-16"></a>         <span class='hs-keyword'>let</span> <span class='hs-varid'>mb_tcs'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>ifaceTyConName</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_tcs</span>
<a name="line-17"></a>         <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkImportedFamInst</span> <span class='hs-varid'>fam</span> <span class='hs-varid'>mb_tcs'</span> <span class='hs-varid'>tycon'</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
		Rules
%*									*
%************************************************************************

We move a IfaceRule from eps_rules to eps_rule_base when all its LHS free vars
are in the type environment.  However, remember that typechecking a Rule may 
(as a side effect) augment the type envt, and so we may need to iterate the process.

\begin{code}
<pre><a name="line-1"></a><a name="tcIfaceRules"></a><span class='hs-definition'>tcIfaceRules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> 		<span class='hs-comment'>-- True &lt;=&gt; ignore rules</span>
<a name="line-2"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceRule</span><span class='hs-keyglyph'>]</span>
<a name="line-3"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreRule</span><span class='hs-keyglyph'>]</span>
<a name="line-4"></a><span class='hs-definition'>tcIfaceRules</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-varid'>if_rules</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceRule</span> <span class='hs-varid'>if_rules</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="tcIfaceRule"></a><span class='hs-definition'>tcIfaceRule</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceRule</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>CoreRule</span>
<a name="line-9"></a><span class='hs-definition'>tcIfaceRule</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceRule</span> <span class='hs-layout'>{</span><span class='hs-varid'>ifRuleName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifActivation</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>act</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifRuleBndrs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bndrs</span><span class='hs-layout'>,</span>
<a name="line-10"></a>			<span class='hs-varid'>ifRuleHead</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fn</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifRuleArgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>args</span><span class='hs-layout'>,</span> <span class='hs-varid'>ifRuleRhs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rhs</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyglyph'>~</span><span class='hs-layout'>(</span><span class='hs-varid'>bndrs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>args'</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> 
<a name="line-12"></a>		<span class='hs-comment'>-- Typecheck the payload lazily, in the hope it'll never be looked at</span>
<a name="line-13"></a>		<span class='hs-varid'>forkM</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Rule"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ftext</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-14"></a>		<span class='hs-varid'>bindIfaceBndrs</span> <span class='hs-varid'>bndrs</span> 			  <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>bndrs'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-15"></a>		<span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>args'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>args</span>
<a name="line-16"></a>		   <span class='hs-layout'>;</span> <span class='hs-varid'>rhs'</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>rhs</span>
<a name="line-17"></a>		   <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>bndrs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>args'</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-18"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>mb_tcs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>ifTopFreeName</span> <span class='hs-varid'>args</span>
<a name="line-19"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rule</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ru_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>ru_fn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fn</span><span class='hs-layout'>,</span> <span class='hs-varid'>ru_act</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>act</span><span class='hs-layout'>,</span> 
<a name="line-20"></a>			  <span class='hs-varid'>ru_bndrs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bndrs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>ru_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>args'</span><span class='hs-layout'>,</span> 
<a name="line-21"></a>			  <span class='hs-varid'>ru_rhs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rhs'</span><span class='hs-layout'>,</span> 
<a name="line-22"></a>			  <span class='hs-varid'>ru_rough</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_tcs</span><span class='hs-layout'>,</span>
<a name="line-23"></a>			  <span class='hs-varid'>ru_local</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>	<span class='hs-comment'>-- An imported RULE is never for a local Id</span>
<a name="line-24"></a>						<span class='hs-comment'>-- or, even if it is (module loop, perhaps)</span>
<a name="line-25"></a>						<span class='hs-comment'>-- we'll just leave it in the non-local set</span>
<a name="line-26"></a>  <span class='hs-keyword'>where</span>
<a name="line-27"></a>	<span class='hs-comment'>-- This function *must* mirror exactly what Rules.topFreeName does</span>
<a name="line-28"></a>	<span class='hs-comment'>-- We could have stored the ru_rough field in the iface file</span>
<a name="line-29"></a>	<span class='hs-comment'>-- but that would be redundant, I think.</span>
<a name="line-30"></a>	<span class='hs-comment'>-- The only wrinkle is that we must not be deceived by</span>
<a name="line-31"></a>	<span class='hs-comment'>-- type syononyms at the top of a type arg.  Since</span>
<a name="line-32"></a>	<span class='hs-comment'>-- we can't tell at this point, we are careful not</span>
<a name="line-33"></a>	<span class='hs-comment'>-- to write them out in coreRuleToIfaceRule</span>
<a name="line-34"></a>    <span class='hs-varid'>ifTopFreeName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Name</span>
<a name="line-35"></a>    <span class='hs-varid'>ifTopFreeName</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTyConApp</span> <span class='hs-varid'>tc</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>ifaceTyConName</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span>
<a name="line-36"></a>    <span class='hs-varid'>ifTopFreeName</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceApp</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ifTopFreeName</span> <span class='hs-varid'>f</span>
<a name="line-37"></a>    <span class='hs-varid'>ifTopFreeName</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceExt</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>                      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>n</span>
<a name="line-38"></a>    <span class='hs-varid'>ifTopFreeName</span> <span class='hs-keyword'>_</span>                                 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
</pre>\end{code}


%************************************************************************
%*									*
		Annotations
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcIfaceAnnotations"></a><span class='hs-definition'>tcIfaceAnnotations</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceAnnotation</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Annotation</span><span class='hs-keyglyph'>]</span>
<a name="line-2"></a><span class='hs-definition'>tcIfaceAnnotations</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceAnnotation</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="tcIfaceAnnotation"></a><span class='hs-definition'>tcIfaceAnnotation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceAnnotation</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>Annotation</span>
<a name="line-5"></a><span class='hs-definition'>tcIfaceAnnotation</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceAnnotation</span> <span class='hs-varid'>target</span> <span class='hs-varid'>serialized</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-6"></a>    <span class='hs-varid'>target'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceAnnTarget</span> <span class='hs-varid'>target</span>
<a name="line-7"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Annotation</span> <span class='hs-layout'>{</span>
<a name="line-8"></a>        <span class='hs-varid'>ann_target</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>target'</span><span class='hs-layout'>,</span>
<a name="line-9"></a>        <span class='hs-varid'>ann_value</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>serialized</span>
<a name="line-10"></a>    <span class='hs-layout'>}</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="tcIfaceAnnTarget"></a><span class='hs-definition'>tcIfaceAnnTarget</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceAnnTarget</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnnTarget</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-13"></a><span class='hs-definition'>tcIfaceAnnTarget</span> <span class='hs-layout'>(</span><span class='hs-conid'>NamedTarget</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-14"></a>    <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTop</span> <span class='hs-varid'>occ</span>
<a name="line-15"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>NamedTarget</span> <span class='hs-varid'>name</span>
<a name="line-16"></a><span class='hs-definition'>tcIfaceAnnTarget</span> <span class='hs-layout'>(</span><span class='hs-conid'>ModuleTarget</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-17"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>ModuleTarget</span> <span class='hs-varid'>mod</span>
<a name="line-18"></a>
</pre>\end{code}


%************************************************************************
%*									*
		Vectorisation information
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcIfaceVectInfo"></a><span class='hs-definition'>tcIfaceVectInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Module</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TypeEnv</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfaceVectInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>VectInfo</span>
<a name="line-2"></a><span class='hs-definition'>tcIfaceVectInfo</span> <span class='hs-varid'>mod</span> <span class='hs-varid'>typeEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceVectInfo</span> 
<a name="line-3"></a>                             <span class='hs-layout'>{</span> <span class='hs-varid'>ifaceVectInfoVar</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vars</span>
<a name="line-4"></a>                             <span class='hs-layout'>,</span> <span class='hs-varid'>ifaceVectInfoTyCon</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tycons</span>
<a name="line-5"></a>                             <span class='hs-layout'>,</span> <span class='hs-varid'>ifaceVectInfoTyConReuse</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyconsReuse</span>
<a name="line-6"></a>                             <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>vVars</span>     <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>vectVarMapping</span> <span class='hs-varid'>vars</span>
<a name="line-8"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>tyConRes1</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>vectTyConMapping</span>      <span class='hs-varid'>tycons</span>
<a name="line-9"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>tyConRes2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>vectTyConReuseMapping</span> <span class='hs-varid'>tyconsReuse</span>
<a name="line-10"></a>       <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>vTyCons</span><span class='hs-layout'>,</span> <span class='hs-varid'>vDataCons</span><span class='hs-layout'>,</span> <span class='hs-varid'>vPAs</span><span class='hs-layout'>,</span> <span class='hs-varid'>vIsos</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip4</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConRes1</span> <span class='hs-varop'>++</span> <span class='hs-varid'>tyConRes2</span><span class='hs-layout'>)</span>
<a name="line-11"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>VectInfo</span> 
<a name="line-12"></a>                  <span class='hs-layout'>{</span> <span class='hs-varid'>vectInfoVar</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkVarEnv</span>  <span class='hs-varid'>vVars</span>
<a name="line-13"></a>                  <span class='hs-layout'>,</span> <span class='hs-varid'>vectInfoTyCon</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNameEnv</span> <span class='hs-varid'>vTyCons</span>
<a name="line-14"></a>                  <span class='hs-layout'>,</span> <span class='hs-varid'>vectInfoDataCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNameEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>concat</span> <span class='hs-varid'>vDataCons</span><span class='hs-layout'>)</span>
<a name="line-15"></a>                  <span class='hs-layout'>,</span> <span class='hs-varid'>vectInfoPADFun</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNameEnv</span> <span class='hs-varid'>vPAs</span>
<a name="line-16"></a>                  <span class='hs-layout'>,</span> <span class='hs-varid'>vectInfoIso</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNameEnv</span> <span class='hs-varid'>vIsos</span>
<a name="line-17"></a>                  <span class='hs-layout'>}</span>
<a name="line-18"></a>       <span class='hs-layout'>}</span>
<a name="line-19"></a>  <span class='hs-keyword'>where</span>
<a name="line-20"></a>    <span class='hs-varid'>vectVarMapping</span> <span class='hs-varid'>name</span> 
<a name="line-21"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>vName</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupOrig</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVectOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-22"></a>           <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>{</span> <span class='hs-varid'>var</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupVar</span> <span class='hs-varid'>name</span>
<a name="line-23"></a>                 <span class='hs-layout'>;</span> <span class='hs-varid'>vVar</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupVar</span> <span class='hs-varid'>vName</span>
<a name="line-24"></a>                 <span class='hs-layout'>}</span>
<a name="line-25"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>var</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>var</span><span class='hs-layout'>,</span> <span class='hs-varid'>vVar</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-26"></a>           <span class='hs-layout'>}</span>
<a name="line-27"></a>    <span class='hs-varid'>vectTyConMapping</span> <span class='hs-varid'>name</span> 
<a name="line-28"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>vName</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupOrig</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVectTyConOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-29"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>paName</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupOrig</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkPADFunOcc</span>    <span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-30"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>isoName</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupOrig</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVectIsoOcc</span>   <span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-31"></a>           <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tycon</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupTyCon</span> <span class='hs-varid'>name</span>
<a name="line-32"></a>                 <span class='hs-layout'>;</span> <span class='hs-varid'>vTycon</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupTyCon</span> <span class='hs-varid'>vName</span>
<a name="line-33"></a>                 <span class='hs-layout'>;</span> <span class='hs-varid'>paTycon</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupVar</span> <span class='hs-varid'>paName</span>
<a name="line-34"></a>                 <span class='hs-layout'>;</span> <span class='hs-varid'>isoTycon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupVar</span> <span class='hs-varid'>isoName</span>
<a name="line-35"></a>                 <span class='hs-layout'>}</span>
<a name="line-36"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>vDataCons</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>vectDataConMapping</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span>
<a name="line-37"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>vTycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- (T, T_v)</span>
<a name="line-38"></a>                     <span class='hs-varid'>vDataCons</span><span class='hs-layout'>,</span>                  <span class='hs-comment'>-- list of (Ci, Ci_v)</span>
<a name="line-39"></a>                     <span class='hs-layout'>(</span><span class='hs-varid'>vName</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>vTycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>paTycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- (T_v, paT)</span>
<a name="line-40"></a>                     <span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>isoTycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- (T, isoT)</span>
<a name="line-41"></a>           <span class='hs-layout'>}</span>
<a name="line-42"></a>    <span class='hs-varid'>vectTyConReuseMapping</span> <span class='hs-varid'>name</span> 
<a name="line-43"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>paName</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupOrig</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkPADFunOcc</span>    <span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-44"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>isoName</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupOrig</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVectIsoOcc</span>   <span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-45"></a>           <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tycon</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupTyCon</span> <span class='hs-varid'>name</span>
<a name="line-46"></a>                 <span class='hs-layout'>;</span> <span class='hs-varid'>paTycon</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupVar</span> <span class='hs-varid'>paName</span>
<a name="line-47"></a>                 <span class='hs-layout'>;</span> <span class='hs-varid'>isoTycon</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupVar</span> <span class='hs-varid'>isoName</span>
<a name="line-48"></a>                 <span class='hs-layout'>;</span> <span class='hs-varid'>vDataCons</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-layout'>(</span><span class='hs-varid'>dataConName</span> <span class='hs-varid'>dc</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>dc</span><span class='hs-layout'>,</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
<a name="line-49"></a>                                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>dc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>tycon</span><span class='hs-keyglyph'>]</span>
<a name="line-50"></a>                 <span class='hs-layout'>}</span>
<a name="line-51"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- (T, T)</span>
<a name="line-52"></a>                     <span class='hs-varid'>vDataCons</span><span class='hs-layout'>,</span>                  <span class='hs-comment'>-- list of (Ci, Ci)</span>
<a name="line-53"></a>                     <span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>paTycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- (T, paT)</span>
<a name="line-54"></a>                     <span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>isoTycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- (T, isoT)</span>
<a name="line-55"></a>           <span class='hs-layout'>}</span>
<a name="line-56"></a>    <span class='hs-varid'>vectDataConMapping</span> <span class='hs-varid'>datacon</span>
<a name="line-57"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dataConName</span> <span class='hs-varid'>datacon</span>
<a name="line-58"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>vName</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupOrig</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVectDataConOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-59"></a>           <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>vDataCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupDataCon</span> <span class='hs-varid'>vName</span>
<a name="line-60"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>datacon</span><span class='hs-layout'>,</span> <span class='hs-varid'>vDataCon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-61"></a>           <span class='hs-layout'>}</span>
<a name="line-62"></a>    <span class='hs-comment'>--</span>
<a name="line-63"></a>    <span class='hs-varid'>lookupVar</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupTypeEnv</span> <span class='hs-varid'>typeEnv</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>of</span>
<a name="line-64"></a>                       <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnId</span> <span class='hs-varid'>var</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>var</span>
<a name="line-65"></a>                       <span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>-&gt;</span> 
<a name="line-66"></a>                         <span class='hs-varid'>panic</span> <span class='hs-str'>"TcIface.tcIfaceVectInfo: not an id"</span>
<a name="line-67"></a>                       <span class='hs-conid'>Nothing</span>        <span class='hs-keyglyph'>-&gt;</span>
<a name="line-68"></a>                         <span class='hs-varid'>panic</span> <span class='hs-str'>"TcIface.tcIfaceVectInfo: unknown name"</span>
<a name="line-69"></a>    <span class='hs-varid'>lookupTyCon</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupTypeEnv</span> <span class='hs-varid'>typeEnv</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>of</span>
<a name="line-70"></a>                         <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tc</span>
<a name="line-71"></a>                         <span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>-&gt;</span> 
<a name="line-72"></a>                           <span class='hs-varid'>panic</span> <span class='hs-str'>"TcIface.tcIfaceVectInfo: not a tycon"</span>
<a name="line-73"></a>                         <span class='hs-conid'>Nothing</span>        <span class='hs-keyglyph'>-&gt;</span>
<a name="line-74"></a>                           <span class='hs-varid'>panic</span> <span class='hs-str'>"TcIface.tcIfaceVectInfo: unknown name"</span>
<a name="line-75"></a>    <span class='hs-varid'>lookupDataCon</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupTypeEnv</span> <span class='hs-varid'>typeEnv</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>of</span>
<a name="line-76"></a>                           <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>ADataCon</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>dc</span>
<a name="line-77"></a>                           <span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>-&gt;</span> 
<a name="line-78"></a>                             <span class='hs-varid'>panic</span> <span class='hs-str'>"TcIface.tcIfaceVectInfo: not a datacon"</span>
<a name="line-79"></a>                           <span class='hs-conid'>Nothing</span>        <span class='hs-keyglyph'>-&gt;</span>
<a name="line-80"></a>                             <span class='hs-varid'>panic</span> <span class='hs-str'>"TcIface.tcIfaceVectInfo: unknown name"</span>
</pre>\end{code}

%************************************************************************
%*									*
			Types
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcIfaceType"></a><span class='hs-definition'>tcIfaceType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>Type</span>
<a name="line-2"></a><span class='hs-definition'>tcIfaceType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTyVar</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceTyVar</span> <span class='hs-varid'>n</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>tv</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-3"></a><span class='hs-definition'>tcIfaceType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceAppTy</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>t1'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>t1</span><span class='hs-layout'>;</span> <span class='hs-varid'>t2'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>t2</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>AppTy</span> <span class='hs-varid'>t1'</span> <span class='hs-varid'>t2'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-4"></a><span class='hs-definition'>tcIfaceType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceFunTy</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>t1'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>t1</span><span class='hs-layout'>;</span> <span class='hs-varid'>t2'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>t2</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>FunTy</span> <span class='hs-varid'>t1'</span> <span class='hs-varid'>t2'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-5"></a><span class='hs-definition'>tcIfaceType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTyConApp</span> <span class='hs-varid'>tc</span> <span class='hs-varid'>ts</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tc'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceTyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>;</span> <span class='hs-varid'>ts'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceTypes</span> <span class='hs-varid'>ts</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>tc'</span> <span class='hs-varid'>ts'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-6"></a><span class='hs-definition'>tcIfaceType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceForAllTy</span> <span class='hs-varid'>tv</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceTyVar</span> <span class='hs-varid'>tv</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tv'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>t'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>t</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForAllTy</span> <span class='hs-varid'>tv'</span> <span class='hs-varid'>t'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-7"></a><span class='hs-definition'>tcIfaceType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfacePredTy</span> <span class='hs-varid'>st</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>st'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfacePredType</span> <span class='hs-varid'>st</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>PredTy</span> <span class='hs-varid'>st'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="tcIfaceTypes"></a><span class='hs-definition'>tcIfaceTypes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceType</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span>
<a name="line-10"></a><span class='hs-definition'>tcIfaceTypes</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>tys</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="tcIfacePredType"></a><span class='hs-comment'>-----------------------------------------</span>
<a name="line-13"></a><span class='hs-definition'>tcIfacePredType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfacePredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>PredType</span>
<a name="line-14"></a><span class='hs-definition'>tcIfacePredType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceClassP</span> <span class='hs-varid'>cls</span> <span class='hs-varid'>ts</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cls'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceClass</span> <span class='hs-varid'>cls</span><span class='hs-layout'>;</span> <span class='hs-varid'>ts'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceTypes</span> <span class='hs-varid'>ts</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassP</span> <span class='hs-varid'>cls'</span> <span class='hs-varid'>ts'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-15"></a><span class='hs-definition'>tcIfacePredType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceIParam</span> <span class='hs-varid'>ip</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ip'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newIPName</span> <span class='hs-varid'>ip</span><span class='hs-layout'>;</span> <span class='hs-varid'>t'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>t</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>IParam</span> <span class='hs-varid'>ip'</span> <span class='hs-varid'>t'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-16"></a><span class='hs-definition'>tcIfacePredType</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceEqPred</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>t1'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>t1</span><span class='hs-layout'>;</span> <span class='hs-varid'>t2'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>t2</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>t1'</span> <span class='hs-varid'>t2'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-17"></a>
<a name="line-18"></a><a name="tcIfaceCtxt"></a><span class='hs-comment'>-----------------------------------------</span>
<a name="line-19"></a><span class='hs-definition'>tcIfaceCtxt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceContext</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>ThetaType</span>
<a name="line-20"></a><span class='hs-definition'>tcIfaceCtxt</span> <span class='hs-varid'>sts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfacePredType</span> <span class='hs-varid'>sts</span>
</pre>\end{code}


%************************************************************************
%*									*
			Core
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcIfaceExpr"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-2"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceType</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Type</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>ty</span>
<a name="line-4"></a>
<a name="line-5"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceLcl</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>tcIfaceLclId</span> <span class='hs-varid'>name</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTick</span> <span class='hs-varid'>modName</span> <span class='hs-varid'>tickNo</span><span class='hs-layout'>)</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>tcIfaceTick</span> <span class='hs-varid'>modName</span> <span class='hs-varid'>tickNo</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceExt</span> <span class='hs-varid'>gbl</span><span class='hs-layout'>)</span>
<a name="line-12"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>tcIfaceExtId</span> <span class='hs-varid'>gbl</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceLit</span> <span class='hs-varid'>lit</span><span class='hs-layout'>)</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-varid'>lit</span><span class='hs-layout'>)</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceFCall</span> <span class='hs-varid'>cc</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-18"></a>    <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>ty</span>
<a name="line-19"></a>    <span class='hs-varid'>u</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUnique</span>
<a name="line-20"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkFCallId</span> <span class='hs-varid'>u</span> <span class='hs-varid'>cc</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-21"></a>
<a name="line-22"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTuple</span> <span class='hs-varid'>boxity</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-23"></a>    <span class='hs-varid'>args'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>args</span>
<a name="line-24"></a>    <span class='hs-comment'>-- Put the missing type arguments back in</span>
<a name="line-25"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>con_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span> <span class='hs-varop'>.</span> <span class='hs-varid'>exprType</span><span class='hs-layout'>)</span> <span class='hs-varid'>args'</span> <span class='hs-varop'>++</span> <span class='hs-varid'>args'</span>
<a name="line-26"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkApps</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-varid'>con_id</span><span class='hs-layout'>)</span> <span class='hs-varid'>con_args</span><span class='hs-layout'>)</span>
<a name="line-27"></a>  <span class='hs-keyword'>where</span>
<a name="line-28"></a>    <span class='hs-varid'>arity</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>args</span>
<a name="line-29"></a>    <span class='hs-varid'>con_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dataConWorkId</span> <span class='hs-layout'>(</span><span class='hs-varid'>tupleCon</span> <span class='hs-varid'>boxity</span> <span class='hs-varid'>arity</span><span class='hs-layout'>)</span>
<a name="line-30"></a>    
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceLam</span> <span class='hs-varid'>bndr</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span>
<a name="line-33"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceBndr</span> <span class='hs-varid'>bndr</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>bndr'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-34"></a>    <span class='hs-conid'>Lam</span> <span class='hs-varid'>bndr'</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>body</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceApp</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg</span><span class='hs-layout'>)</span>
<a name="line-37"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>App</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>fun</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>arg</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceCase</span> <span class='hs-varid'>scrut</span> <span class='hs-varid'>case_bndr</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>alts</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-40"></a>    <span class='hs-varid'>scrut'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>scrut</span>
<a name="line-41"></a>    <span class='hs-varid'>case_bndr_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newIfaceName</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVarOccFS</span> <span class='hs-varid'>case_bndr</span><span class='hs-layout'>)</span>
<a name="line-42"></a>    <span class='hs-keyword'>let</span>
<a name="line-43"></a>	<span class='hs-varid'>scrut_ty</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exprType</span> <span class='hs-varid'>scrut'</span>
<a name="line-44"></a>	<span class='hs-varid'>case_bndr'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>case_bndr_name</span> <span class='hs-varid'>scrut_ty</span>
<a name="line-45"></a>	<span class='hs-varid'>tc_app</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitTyConApp</span> <span class='hs-varid'>scrut_ty</span>
<a name="line-46"></a>		<span class='hs-comment'>-- NB: Won't always succeed (polymoprhic case)</span>
<a name="line-47"></a>		<span class='hs-comment'>--     but won't be demanded in those cases</span>
<a name="line-48"></a>		<span class='hs-comment'>-- NB: not tcSplitTyConApp; we are looking at Core here</span>
<a name="line-49"></a>		<span class='hs-comment'>--     look through non-rec newtypes to find the tycon that</span>
<a name="line-50"></a>		<span class='hs-comment'>--     corresponds to the datacon in this case alternative</span>
<a name="line-51"></a>
<a name="line-52"></a>    <span class='hs-varid'>extendIfaceIdEnv</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>case_bndr'</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-53"></a>     <span class='hs-varid'>alts'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcIfaceAlt</span> <span class='hs-varid'>scrut'</span> <span class='hs-varid'>tc_app</span><span class='hs-layout'>)</span> <span class='hs-varid'>alts</span>
<a name="line-54"></a>     <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>ty</span>
<a name="line-55"></a>     <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Case</span> <span class='hs-varid'>scrut'</span> <span class='hs-varid'>case_bndr'</span> <span class='hs-varid'>ty'</span> <span class='hs-varid'>alts'</span><span class='hs-layout'>)</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceLet</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceNonRec</span> <span class='hs-varid'>bndr</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-58"></a>    <span class='hs-varid'>rhs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>rhs</span>
<a name="line-59"></a>    <span class='hs-varid'>id</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceLetBndr</span> <span class='hs-varid'>bndr</span>
<a name="line-60"></a>    <span class='hs-varid'>body'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>extendIfaceIdEnv</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>id</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span>
<a name="line-61"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Let</span> <span class='hs-layout'>(</span><span class='hs-conid'>NonRec</span> <span class='hs-varid'>id</span> <span class='hs-varid'>rhs'</span><span class='hs-layout'>)</span> <span class='hs-varid'>body'</span><span class='hs-layout'>)</span>
<a name="line-62"></a>
<a name="line-63"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceLet</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceRec</span> <span class='hs-varid'>pairs</span><span class='hs-layout'>)</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-64"></a>    <span class='hs-varid'>ids</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceLetBndr</span> <span class='hs-varid'>bndrs</span>
<a name="line-65"></a>    <span class='hs-varid'>extendIfaceIdEnv</span> <span class='hs-varid'>ids</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-66"></a>     <span class='hs-varid'>rhss'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>rhss</span>
<a name="line-67"></a>     <span class='hs-varid'>body'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>body</span>
<a name="line-68"></a>     <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Let</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rec</span> <span class='hs-layout'>(</span><span class='hs-varid'>ids</span> <span class='hs-varop'>`zip`</span> <span class='hs-varid'>rhss'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>body'</span><span class='hs-layout'>)</span>
<a name="line-69"></a>  <span class='hs-keyword'>where</span>
<a name="line-70"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>bndrs</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhss</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip</span> <span class='hs-varid'>pairs</span>
<a name="line-71"></a>
<a name="line-72"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceCast</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-73"></a>    <span class='hs-varid'>expr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>expr</span>
<a name="line-74"></a>    <span class='hs-varid'>co'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>co</span>
<a name="line-75"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cast</span> <span class='hs-varid'>expr'</span> <span class='hs-varid'>co'</span><span class='hs-layout'>)</span>
<a name="line-76"></a>
<a name="line-77"></a><span class='hs-definition'>tcIfaceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceNote</span> <span class='hs-varid'>note</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-78"></a>    <span class='hs-varid'>expr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>expr</span>
<a name="line-79"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>note</span> <span class='hs-keyword'>of</span>
<a name="line-80"></a>        <span class='hs-conid'>IfaceInlineMe</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Note</span> <span class='hs-conid'>InlineMe</span>   <span class='hs-varid'>expr'</span><span class='hs-layout'>)</span>
<a name="line-81"></a>        <span class='hs-conid'>IfaceSCC</span> <span class='hs-varid'>cc</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Note</span> <span class='hs-layout'>(</span><span class='hs-conid'>SCC</span> <span class='hs-varid'>cc</span><span class='hs-layout'>)</span>   <span class='hs-varid'>expr'</span><span class='hs-layout'>)</span>
<a name="line-82"></a>        <span class='hs-conid'>IfaceCoreNote</span> <span class='hs-varid'>n</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Note</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoreNote</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>expr'</span><span class='hs-layout'>)</span>
<a name="line-83"></a>
<a name="line-84"></a><a name="tcIfaceAlt"></a><span class='hs-comment'>-------------------------</span>
<a name="line-85"></a><span class='hs-definition'>tcIfaceAlt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-86"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceConAlt</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FastString</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>IfaceExpr</span><span class='hs-layout'>)</span>
<a name="line-87"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-layout'>(</span><span class='hs-conid'>AltCon</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreExpr</span><span class='hs-layout'>)</span>
<a name="line-88"></a><span class='hs-definition'>tcIfaceAlt</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceDefault</span><span class='hs-layout'>,</span> <span class='hs-varid'>names</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span>
<a name="line-89"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>null</span> <span class='hs-varid'>names</span> <span class='hs-layout'>)</span> <span class='hs-keyword'>do</span>
<a name="line-90"></a>    <span class='hs-varid'>rhs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>rhs</span>
<a name="line-91"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DEFAULT</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs'</span><span class='hs-layout'>)</span>
<a name="line-92"></a>  
<a name="line-93"></a><span class='hs-definition'>tcIfaceAlt</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceLitAlt</span> <span class='hs-varid'>lit</span><span class='hs-layout'>,</span> <span class='hs-varid'>names</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span>
<a name="line-94"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>null</span> <span class='hs-varid'>names</span> <span class='hs-layout'>)</span> <span class='hs-keyword'>do</span>
<a name="line-95"></a>    <span class='hs-varid'>rhs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>rhs</span>
<a name="line-96"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitAlt</span> <span class='hs-varid'>lit</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs'</span><span class='hs-layout'>)</span>
<a name="line-97"></a>
<a name="line-98"></a><span class='hs-comment'>-- A case alternative is made quite a bit more complicated</span>
<a name="line-99"></a><span class='hs-comment'>-- by the fact that we omit type annotations because we can</span>
<a name="line-100"></a><span class='hs-comment'>-- work them out.  True enough, but its not that easy!</span>
<a name="line-101"></a><span class='hs-definition'>tcIfaceAlt</span> <span class='hs-varid'>scrut</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>inst_tys</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceDataAlt</span> <span class='hs-varid'>data_occ</span><span class='hs-layout'>,</span> <span class='hs-varid'>arg_strs</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span>
<a name="line-102"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceDataCon</span> <span class='hs-varid'>data_occ</span>
<a name="line-103"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>debugIsOn</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>con</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-104"></a>	       <span class='hs-layout'>(</span><span class='hs-varid'>failIfM</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>scrut</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>con</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>tycon</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-105"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>tcIfaceDataAlt</span> <span class='hs-varid'>con</span> <span class='hs-varid'>inst_tys</span> <span class='hs-varid'>arg_strs</span> <span class='hs-varid'>rhs</span> <span class='hs-layout'>}</span>
<a name="line-106"></a>		  
<a name="line-107"></a><span class='hs-definition'>tcIfaceAlt</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>inst_tys</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTupleAlt</span> <span class='hs-sel'>_boxity</span><span class='hs-layout'>,</span> <span class='hs-varid'>arg_occs</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span>
<a name="line-108"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>isTupleTyCon</span> <span class='hs-varid'>tycon</span> <span class='hs-layout'>)</span>
<a name="line-109"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>data_con</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>tycon</span>
<a name="line-110"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>tcIfaceDataAlt</span> <span class='hs-varid'>data_con</span> <span class='hs-varid'>inst_tys</span> <span class='hs-varid'>arg_occs</span> <span class='hs-varid'>rhs</span> <span class='hs-layout'>}</span>
<a name="line-111"></a>
<a name="line-112"></a><a name="tcIfaceDataAlt"></a><span class='hs-definition'>tcIfaceDataAlt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FastString</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfaceExpr</span>
<a name="line-113"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-layout'>(</span><span class='hs-conid'>AltCon</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreExpr</span><span class='hs-layout'>)</span>
<a name="line-114"></a><span class='hs-definition'>tcIfaceDataAlt</span> <span class='hs-varid'>con</span> <span class='hs-varid'>inst_tys</span> <span class='hs-varid'>arg_strs</span> <span class='hs-varid'>rhs</span>
<a name="line-115"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>us</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUniqueSupply</span>
<a name="line-116"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>uniqs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uniqsFromSupply</span> <span class='hs-varid'>us</span>
<a name="line-117"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>ex_tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>co_tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>arg_ids</span><span class='hs-layout'>)</span>
<a name="line-118"></a>	              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dataConRepFSInstPat</span> <span class='hs-varid'>arg_strs</span> <span class='hs-varid'>uniqs</span> <span class='hs-varid'>con</span> <span class='hs-varid'>inst_tys</span>
<a name="line-119"></a>              <span class='hs-varid'>all_tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ex_tvs</span> <span class='hs-varop'>++</span> <span class='hs-varid'>co_tvs</span>
<a name="line-120"></a>
<a name="line-121"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>rhs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>extendIfaceTyVarEnv</span> <span class='hs-varid'>all_tvs</span>	<span class='hs-varop'>$</span>
<a name="line-122"></a>		  <span class='hs-varid'>extendIfaceIdEnv</span> <span class='hs-varid'>arg_ids</span>	<span class='hs-varop'>$</span>
<a name="line-123"></a>		  <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>rhs</span>
<a name="line-124"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataAlt</span> <span class='hs-varid'>con</span><span class='hs-layout'>,</span> <span class='hs-varid'>all_tvs</span> <span class='hs-varop'>++</span> <span class='hs-varid'>arg_ids</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code}


\begin{code}
<pre><a name="line-1"></a><a name="tcExtCoreBindings"></a><span class='hs-definition'>tcExtCoreBindings</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceBinding</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBind</span><span class='hs-keyglyph'>]</span>	<span class='hs-comment'>-- Used for external core</span>
<a name="line-2"></a><span class='hs-definition'>tcExtCoreBindings</span> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-3"></a><span class='hs-definition'>tcExtCoreBindings</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-conop'>:</span><span class='hs-varid'>bs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>do_one</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcExtCoreBindings</span> <span class='hs-varid'>bs</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="do_one"></a><span class='hs-definition'>do_one</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceBinding</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBind</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBind</span><span class='hs-keyglyph'>]</span>
<a name="line-6"></a><span class='hs-definition'>do_one</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceNonRec</span> <span class='hs-varid'>bndr</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>rhs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>rhs</span>
<a name="line-8"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>bndr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newExtCoreBndr</span> <span class='hs-varid'>bndr</span>
<a name="line-9"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>extendIfaceIdEnv</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>bndr'</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> 
<a name="line-10"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>core_binds</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>thing_inside</span>
<a name="line-11"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>NonRec</span> <span class='hs-varid'>bndr'</span> <span class='hs-varid'>rhs'</span> <span class='hs-conop'>:</span> <span class='hs-varid'>core_binds</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-12"></a>
<a name="line-13"></a><span class='hs-definition'>do_one</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceRec</span> <span class='hs-varid'>pairs</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span>
<a name="line-14"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>bndrs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>newExtCoreBndr</span> <span class='hs-varid'>bndrs</span>
<a name="line-15"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>extendIfaceIdEnv</span> <span class='hs-varid'>bndrs'</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-16"></a> 	<span class='hs-layout'>{</span> <span class='hs-varid'>rhss'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>rhss</span>
<a name="line-17"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>core_binds</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>thing_inside</span>
<a name="line-18"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rec</span> <span class='hs-layout'>(</span><span class='hs-varid'>bndrs'</span> <span class='hs-varop'>`zip`</span> <span class='hs-varid'>rhss'</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>core_binds</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-19"></a>  <span class='hs-keyword'>where</span>
<a name="line-20"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>bndrs</span><span class='hs-layout'>,</span><span class='hs-varid'>rhss</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip</span> <span class='hs-varid'>pairs</span>
</pre>\end{code}


%************************************************************************
%*									*
		IdInfo
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcIdDetails"></a><span class='hs-definition'>tcIdDetails</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceIdDetails</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>IdDetails</span>
<a name="line-2"></a><span class='hs-definition'>tcIdDetails</span> <span class='hs-conid'>IfVanillaId</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>VanillaId</span>
<a name="line-3"></a><span class='hs-definition'>tcIdDetails</span> <span class='hs-conid'>IfDFunId</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>DFunId</span>
<a name="line-4"></a><span class='hs-definition'>tcIdDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfRecSelId</span> <span class='hs-varid'>tc</span> <span class='hs-varid'>naughty</span><span class='hs-layout'>)</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tc'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceTyCon</span> <span class='hs-varid'>tc</span>
<a name="line-6"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecSelId</span> <span class='hs-layout'>{</span> <span class='hs-varid'>sel_tycon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tc'</span><span class='hs-layout'>,</span> <span class='hs-varid'>sel_naughty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>naughty</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="tcIdInfo"></a><span class='hs-definition'>tcIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfaceIdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>IdInfo</span>
<a name="line-9"></a><span class='hs-definition'>tcIdInfo</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span> 
<a name="line-10"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ignore_prags</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>vanillaIdInfo</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>info</span> <span class='hs-keyword'>of</span>
<a name="line-12"></a>			<span class='hs-conid'>NoInfo</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>vanillaIdInfo</span>
<a name="line-13"></a>			<span class='hs-conid'>HasInfo</span> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>foldlM</span> <span class='hs-varid'>tcPrag</span> <span class='hs-varid'>init_info</span> <span class='hs-varid'>info</span>
<a name="line-14"></a>  <span class='hs-keyword'>where</span>
<a name="line-15"></a>    <span class='hs-comment'>-- Set the CgInfo to something sensible but uninformative before</span>
<a name="line-16"></a>    <span class='hs-comment'>-- we start; default assumption is that it has CAFs</span>
<a name="line-17"></a>    <span class='hs-varid'>init_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vanillaIdInfo</span>
<a name="line-18"></a>
<a name="line-19"></a>    <span class='hs-varid'>tcPrag</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfaceInfoItem</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>IdInfo</span>
<a name="line-20"></a>    <span class='hs-varid'>tcPrag</span> <span class='hs-varid'>info</span> <span class='hs-conid'>HsNoCafRefs</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varop'>`setCafInfo`</span>   <span class='hs-conid'>NoCafRefs</span><span class='hs-layout'>)</span>
<a name="line-21"></a>    <span class='hs-varid'>tcPrag</span> <span class='hs-varid'>info</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsArity</span> <span class='hs-varid'>arity</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varop'>`setArityInfo`</span> <span class='hs-varid'>arity</span><span class='hs-layout'>)</span>
<a name="line-22"></a>    <span class='hs-varid'>tcPrag</span> <span class='hs-varid'>info</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsStrictness</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varop'>`setAllStrictnessInfo`</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>
<a name="line-23"></a>
<a name="line-24"></a>	<span class='hs-comment'>-- The next two are lazy, so they don't transitively suck stuff in</span>
<a name="line-25"></a>    <span class='hs-varid'>tcPrag</span> <span class='hs-varid'>info</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsWorker</span> <span class='hs-varid'>nm</span> <span class='hs-varid'>arity</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcWorkerInfo</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span> <span class='hs-varid'>nm</span> <span class='hs-varid'>arity</span>
<a name="line-26"></a>    <span class='hs-varid'>tcPrag</span> <span class='hs-varid'>info</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsInline</span> <span class='hs-varid'>inline_prag</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varop'>`setInlinePragInfo`</span> <span class='hs-varid'>inline_prag</span><span class='hs-layout'>)</span>
<a name="line-27"></a>    <span class='hs-varid'>tcPrag</span> <span class='hs-varid'>info</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsUnfold</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-28"></a>          <span class='hs-varid'>maybe_expr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcPragExpr</span> <span class='hs-varid'>name</span> <span class='hs-varid'>expr</span>
<a name="line-29"></a>	  <span class='hs-keyword'>let</span>
<a name="line-30"></a>		<span class='hs-comment'>-- maybe_expr' doesn't get looked at if the unfolding</span>
<a name="line-31"></a>		<span class='hs-comment'>-- is never inspected; so the typecheck doesn't even happen</span>
<a name="line-32"></a>		<span class='hs-varid'>unfold_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>maybe_expr'</span> <span class='hs-keyword'>of</span>
<a name="line-33"></a>				<span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>noUnfolding</span>
<a name="line-34"></a>				<span class='hs-conid'>Just</span> <span class='hs-varid'>expr'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mkTopUnfolding</span> <span class='hs-varid'>expr'</span> 
<a name="line-35"></a>          <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varop'>`setUnfoldingInfoLazily`</span> <span class='hs-varid'>unfold_info</span><span class='hs-layout'>)</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="tcWorkerInfo"></a><span class='hs-definition'>tcWorkerInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Arity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>IdInfo</span>
<a name="line-2"></a><span class='hs-definition'>tcWorkerInfo</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span> <span class='hs-varid'>wkr</span> <span class='hs-varid'>arity</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>mb_wkr_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>forkM_maybe</span> <span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcIfaceExtId</span> <span class='hs-varid'>wkr</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a>	<span class='hs-comment'>-- We return without testing maybe_wkr_id, but as soon as info is</span>
<a name="line-6"></a>	<span class='hs-comment'>-- looked at we will test it.  That's ok, because its outside the</span>
<a name="line-7"></a>	<span class='hs-comment'>-- knot; and there seems no big reason to further defer the</span>
<a name="line-8"></a>	<span class='hs-comment'>-- tcIfaceId lookup.  (Contrast with tcPragExpr, where postponing walking</span>
<a name="line-9"></a>	<span class='hs-comment'>-- over the unfolding until it's actually used does seem worth while.)</span>
<a name="line-10"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>us</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUniqueSupply</span>
<a name="line-11"></a>
<a name="line-12"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-keyword'>case</span> <span class='hs-varid'>mb_wkr_id</span> <span class='hs-keyword'>of</span>
<a name="line-13"></a>		     <span class='hs-conid'>Nothing</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>info</span>
<a name="line-14"></a>		     <span class='hs-conid'>Just</span> <span class='hs-varid'>wkr_id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>add_wkr_info</span> <span class='hs-varid'>us</span> <span class='hs-varid'>wkr_id</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-15"></a>  <span class='hs-keyword'>where</span>
<a name="line-16"></a>    <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Worker for"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>wkr</span>
<a name="line-17"></a>    <span class='hs-varid'>add_wkr_info</span> <span class='hs-varid'>us</span> <span class='hs-varid'>wkr_id</span> <span class='hs-varid'>info</span>
<a name="line-18"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span> <span class='hs-varop'>`setUnfoldingInfoLazily`</span>  <span class='hs-varid'>mk_unfolding</span> <span class='hs-varid'>us</span> <span class='hs-varid'>wkr_id</span>
<a name="line-19"></a>	       <span class='hs-varop'>`setWorkerInfo`</span>           <span class='hs-conid'>HasWorker</span> <span class='hs-varid'>wkr_id</span> <span class='hs-varid'>arity</span>
<a name="line-20"></a>
<a name="line-21"></a>    <span class='hs-varid'>mk_unfolding</span> <span class='hs-varid'>us</span> <span class='hs-varid'>wkr_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTopUnfolding</span> <span class='hs-layout'>(</span><span class='hs-varid'>initUs_</span> <span class='hs-varid'>us</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkWrapper</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>strict_sig</span><span class='hs-layout'>)</span> <span class='hs-varid'>wkr_id</span><span class='hs-layout'>)</span>
<a name="line-22"></a>
<a name="line-23"></a>    	<span class='hs-comment'>-- We are relying here on strictness info always appearing </span>
<a name="line-24"></a>	<span class='hs-comment'>-- before worker info,  fingers crossed ....</span>
<a name="line-25"></a>    <span class='hs-varid'>strict_sig</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>newStrictnessInfo</span> <span class='hs-varid'>info</span> <span class='hs-keyword'>of</span>
<a name="line-26"></a>		   <span class='hs-conid'>Just</span> <span class='hs-varid'>sig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>sig</span>
<a name="line-27"></a>		   <span class='hs-conid'>Nothing</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Worker info but no strictness for"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>wkr</span><span class='hs-layout'>)</span>
</pre>\end{code}

For unfoldings we try to do the job lazily, so that we never type check
an unfolding that isn't going to be looked at.

\begin{code}
<pre><a name="line-1"></a><a name="tcPragExpr"></a><span class='hs-definition'>tcPragExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfaceExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>CoreExpr</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>tcPragExpr</span> <span class='hs-varid'>name</span> <span class='hs-varid'>expr</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>forkM_maybe</span> <span class='hs-varid'>doc</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-4"></a>    <span class='hs-varid'>core_expr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceExpr</span> <span class='hs-varid'>expr</span>
<a name="line-5"></a>
<a name="line-6"></a>                <span class='hs-comment'>-- Check for type consistency in the unfolding</span>
<a name="line-7"></a>    <span class='hs-varid'>ifOptM</span> <span class='hs-conid'>Opt_DoCoreLinting</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-8"></a>        <span class='hs-varid'>in_scope</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get_in_scope_ids</span>
<a name="line-9"></a>        <span class='hs-keyword'>case</span> <span class='hs-varid'>lintUnfolding</span> <span class='hs-varid'>noSrcLoc</span> <span class='hs-varid'>in_scope</span> <span class='hs-varid'>core_expr'</span> <span class='hs-keyword'>of</span>
<a name="line-10"></a>          <span class='hs-conid'>Nothing</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-11"></a>          <span class='hs-conid'>Just</span> <span class='hs-varid'>fail_msg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Iface Lint failure"</span> <span class='hs-layout'>(</span><span class='hs-varid'>hang</span> <span class='hs-varid'>doc</span> <span class='hs-num'>2</span> <span class='hs-varid'>fail_msg</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a>    <span class='hs-varid'>return</span> <span class='hs-varid'>core_expr'</span>
<a name="line-14"></a>  <span class='hs-keyword'>where</span>
<a name="line-15"></a>    <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Unfolding of"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span>
<a name="line-16"></a>    <span class='hs-varid'>get_in_scope_ids</span> 	<span class='hs-comment'>-- Urgh; but just for linting</span>
<a name="line-17"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>setLclEnv</span> <span class='hs-conid'>()</span> <span class='hs-varop'>$</span> 
<a name="line-18"></a>	  <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getGblEnv</span> 
<a name="line-19"></a>		<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>if_rec_types</span> <span class='hs-varid'>env</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-20"></a>			  <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>;</span>
<a name="line-21"></a>			  <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>get_env</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-22"></a>		<span class='hs-layout'>{</span> <span class='hs-varid'>type_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get_env</span>
<a name="line-23"></a>		<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>typeEnvIds</span> <span class='hs-varid'>type_env</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
</pre>\end{code}



%************************************************************************
%*									*
		Getting from Names to TyThings
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcIfaceGlobal"></a><span class='hs-definition'>tcIfaceGlobal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>TyThing</span>
<a name="line-2"></a><span class='hs-definition'>tcIfaceGlobal</span> <span class='hs-varid'>name</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>wiredInNameTyThing_maybe</span> <span class='hs-varid'>name</span>
<a name="line-4"></a>	<span class='hs-comment'>-- Wired-in things include TyCons, DataCons, and Ids</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ifCheckWiredInThing</span> <span class='hs-varid'>thing</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>thing</span> <span class='hs-layout'>}</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getGblEnv</span>
<a name="line-8"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>if_rec_types</span> <span class='hs-varid'>env</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>	<span class='hs-comment'>-- Note [Tying the knot]</span>
<a name="line-9"></a>	    <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>mod</span><span class='hs-layout'>,</span> <span class='hs-varid'>get_type_env</span><span class='hs-layout'>)</span> 
<a name="line-10"></a>		<span class='hs-keyglyph'>|</span> <span class='hs-varid'>nameIsLocalOrFrom</span> <span class='hs-varid'>mod</span> <span class='hs-varid'>name</span>
<a name="line-11"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> 		<span class='hs-comment'>-- It's defined in the module being compiled</span>
<a name="line-12"></a>	  	<span class='hs-layout'>{</span> <span class='hs-varid'>type_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>setLclEnv</span> <span class='hs-conid'>()</span> <span class='hs-varid'>get_type_env</span>		<span class='hs-comment'>-- yuk</span>
<a name="line-13"></a>		<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupNameEnv</span> <span class='hs-varid'>type_env</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>of</span>
<a name="line-14"></a>			<span class='hs-conid'>Just</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>thing</span>
<a name="line-15"></a>			<span class='hs-conid'>Nothing</span>	  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tcIfaceGlobal (local): not found:"</span>  
<a name="line-16"></a>						<span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>type_env</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-17"></a>
<a name="line-18"></a>	  <span class='hs-layout'>;</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-19"></a>
<a name="line-20"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getTopEnv</span>
<a name="line-21"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>mb_thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>lookupTypeHscEnv</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-22"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_thing</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-23"></a>	    <span class='hs-conid'>Just</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>thing</span> <span class='hs-layout'>;</span>
<a name="line-24"></a>	    <span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-25"></a>
<a name="line-26"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>mb_thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>importDecl</span> <span class='hs-varid'>name</span> 	<span class='hs-comment'>-- It's imported; go get it</span>
<a name="line-27"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_thing</span> <span class='hs-keyword'>of</span>
<a name="line-28"></a>	    <span class='hs-conid'>Failed</span> <span class='hs-varid'>err</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failIfM</span> <span class='hs-varid'>err</span>
<a name="line-29"></a>	    <span class='hs-conid'>Succeeded</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>thing</span>
<a name="line-30"></a>    <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-comment'>-- Note [Tying the knot]</span>
<a name="line-33"></a><span class='hs-comment'>-- ~~~~~~~~~~~~~~~~~~~~~</span>
<a name="line-34"></a><span class='hs-comment'>-- The if_rec_types field is used in two situations:</span>
<a name="line-35"></a><span class='hs-comment'>--</span>
<a name="line-36"></a><span class='hs-comment'>-- a) Compiling M.hs, which indiretly imports Foo.hi, which mentions M.T</span>
<a name="line-37"></a><span class='hs-comment'>--    Then we look up M.T in M's type environment, which is splatted into if_rec_types</span>
<a name="line-38"></a><span class='hs-comment'>--    after we've built M's type envt.</span>
<a name="line-39"></a><span class='hs-comment'>--</span>
<a name="line-40"></a><span class='hs-comment'>-- b) In ghc --make, during the upsweep, we encounter M.hs, whose interface M.hi</span>
<a name="line-41"></a><span class='hs-comment'>--    is up to date.  So we call typecheckIface on M.hi.  This splats M.T into </span>
<a name="line-42"></a><span class='hs-comment'>--    if_rec_types so that the (lazily typechecked) decls see all the other decls</span>
<a name="line-43"></a><span class='hs-comment'>--</span>
<a name="line-44"></a><span class='hs-comment'>-- In case (b) it's important to do the if_rec_types check *before* looking in the HPT</span>
<a name="line-45"></a><span class='hs-comment'>-- Because if M.hs also has M.hs-boot, M.T will *already be* in the HPT, but in its</span>
<a name="line-46"></a><span class='hs-comment'>-- emasculated form (e.g. lacking data constructors).</span>
<a name="line-47"></a>
<a name="line-48"></a><a name="tcIfaceTyCon"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceTyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>TyCon</span>
<a name="line-49"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceIntTc</span>       	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcWiredInTyCon</span> <span class='hs-varid'>intTyCon</span>
<a name="line-50"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceBoolTc</span>      	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcWiredInTyCon</span> <span class='hs-varid'>boolTyCon</span>
<a name="line-51"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceCharTc</span>      	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcWiredInTyCon</span> <span class='hs-varid'>charTyCon</span>
<a name="line-52"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceListTc</span>      	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcWiredInTyCon</span> <span class='hs-varid'>listTyCon</span>
<a name="line-53"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfacePArrTc</span>      	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcWiredInTyCon</span> <span class='hs-varid'>parrTyCon</span>
<a name="line-54"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTupTc</span> <span class='hs-varid'>bx</span> <span class='hs-varid'>ar</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcWiredInTyCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>tupleTyCon</span> <span class='hs-varid'>bx</span> <span class='hs-varid'>ar</span><span class='hs-layout'>)</span>
<a name="line-55"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTc</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceGlobal</span> <span class='hs-varid'>name</span> 
<a name="line-56"></a>				     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>check_tc</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyThingTyCon</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-57"></a>  <span class='hs-keyword'>where</span>
<a name="line-58"></a>    <span class='hs-varid'>check_tc</span> <span class='hs-varid'>tc</span>
<a name="line-59"></a>     <span class='hs-keyglyph'>|</span> <span class='hs-varid'>debugIsOn</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>toIfaceTyCon</span> <span class='hs-varid'>tc</span> <span class='hs-keyword'>of</span>
<a name="line-60"></a>                   <span class='hs-conid'>IfaceTc</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tc</span>
<a name="line-61"></a>                   <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprTrace</span> <span class='hs-str'>"check_tc"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-varid'>tc</span>
<a name="line-62"></a>     <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tc</span>
<a name="line-63"></a><span class='hs-comment'>-- we should be okay just returning Kind constructors without extra loading</span>
<a name="line-64"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceLiftedTypeKindTc</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>liftedTypeKindTyCon</span>
<a name="line-65"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceOpenTypeKindTc</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>openTypeKindTyCon</span>
<a name="line-66"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceUnliftedTypeKindTc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>unliftedTypeKindTyCon</span>
<a name="line-67"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceArgTypeKindTc</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>argTypeKindTyCon</span>
<a name="line-68"></a><span class='hs-definition'>tcIfaceTyCon</span> <span class='hs-conid'>IfaceUbxTupleKindTc</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ubxTupleKindTyCon</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="tcWiredInTyCon"></a><span class='hs-comment'>-- Even though we are in an interface file, we want to make</span>
<a name="line-71"></a><span class='hs-comment'>-- sure the instances and RULES of this tycon are loaded </span>
<a name="line-72"></a><span class='hs-comment'>-- Imagine: f :: Double -&gt; Double</span>
<a name="line-73"></a><span class='hs-definition'>tcWiredInTyCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>TyCon</span>
<a name="line-74"></a><span class='hs-definition'>tcWiredInTyCon</span> <span class='hs-varid'>tc</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ifCheckWiredInThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span>
<a name="line-75"></a>		       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>tc</span> <span class='hs-layout'>}</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="tcIfaceClass"></a><span class='hs-definition'>tcIfaceClass</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>Class</span>
<a name="line-78"></a><span class='hs-definition'>tcIfaceClass</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceGlobal</span> <span class='hs-varid'>name</span>
<a name="line-79"></a>		       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyThingClass</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-80"></a>
<a name="line-81"></a><a name="tcIfaceDataCon"></a><span class='hs-definition'>tcIfaceDataCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>DataCon</span>
<a name="line-82"></a><span class='hs-definition'>tcIfaceDataCon</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceGlobal</span> <span class='hs-varid'>name</span>
<a name="line-83"></a>		 	 <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>thing</span> <span class='hs-keyword'>of</span>
<a name="line-84"></a>				<span class='hs-conid'>ADataCon</span> <span class='hs-varid'>dc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>dc</span>
<a name="line-85"></a>				<span class='hs-keyword'>_</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tcIfaceExtDC"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-varop'>$$</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-86"></a>
<a name="line-87"></a><a name="tcIfaceExtId"></a><span class='hs-definition'>tcIfaceExtId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>Id</span>
<a name="line-88"></a><span class='hs-definition'>tcIfaceExtId</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceGlobal</span> <span class='hs-varid'>name</span>
<a name="line-89"></a>		       <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>thing</span> <span class='hs-keyword'>of</span>
<a name="line-90"></a>			  <span class='hs-conid'>AnId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>id</span>
<a name="line-91"></a>			  <span class='hs-keyword'>_</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tcIfaceExtId"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-varop'>$$</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code}

%************************************************************************
%*									*
		Bindings
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="bindIfaceBndr"></a><span class='hs-definition'>bindIfaceBndr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceBndr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoreBndr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span>
<a name="line-2"></a><span class='hs-definition'>bindIfaceBndr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceIdBndr</span> <span class='hs-layout'>(</span><span class='hs-varid'>fs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newIfaceName</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVarOccFS</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-4"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>ty</span>
<a name="line-5"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty'</span>
<a name="line-6"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>extendIfaceIdEnv</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>id</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-varid'>thing_inside</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-7"></a><span class='hs-definition'>bindIfaceBndr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfaceTvBndr</span> <span class='hs-varid'>bndr</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span>
<a name="line-8"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceTyVar</span> <span class='hs-varid'>bndr</span> <span class='hs-varid'>thing_inside</span>
<a name="line-9"></a>    
<a name="line-10"></a><a name="bindIfaceBndrs"></a><span class='hs-definition'>bindIfaceBndrs</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceBndr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBndr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span>
<a name="line-11"></a><span class='hs-definition'>bindIfaceBndrs</span> <span class='hs-conid'>[]</span>     <span class='hs-varid'>thing_inside</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>thing_inside</span> <span class='hs-conid'>[]</span>
<a name="line-12"></a><span class='hs-definition'>bindIfaceBndrs</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-conop'>:</span><span class='hs-varid'>bs</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span>
<a name="line-13"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceBndr</span> <span class='hs-varid'>b</span>	<span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>b'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-14"></a>    <span class='hs-varid'>bindIfaceBndrs</span> <span class='hs-varid'>bs</span>	<span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>bs'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-15"></a>    <span class='hs-varid'>thing_inside</span> <span class='hs-layout'>(</span><span class='hs-varid'>b'</span><span class='hs-conop'>:</span><span class='hs-varid'>bs'</span><span class='hs-layout'>)</span>
<a name="line-16"></a>
<a name="line-17"></a>
<a name="line-18"></a><a name="tcIfaceLetBndr"></a><span class='hs-comment'>-----------------------</span>
<a name="line-19"></a><span class='hs-definition'>tcIfaceLetBndr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceLetBndr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>Id</span>
<a name="line-20"></a><span class='hs-definition'>tcIfaceLetBndr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfLetBndr</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>
<a name="line-21"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newIfaceName</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVarOccFS</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span>
<a name="line-22"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>ty</span>
<a name="line-23"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>info</span> <span class='hs-keyword'>of</span>
<a name="line-24"></a>		<span class='hs-conid'>NoInfo</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>)</span>
<a name="line-25"></a>		<span class='hs-conid'>HasInfo</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkLocalIdWithInfo</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty'</span> <span class='hs-layout'>(</span><span class='hs-varid'>tc_info</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span> 
<a name="line-26"></a>  <span class='hs-keyword'>where</span>
<a name="line-27"></a>	<span class='hs-comment'>-- Similar to tcIdInfo, but much simpler</span>
<a name="line-28"></a>    <span class='hs-varid'>tc_info</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vanillaIdInfo</span>
<a name="line-29"></a>    <span class='hs-varid'>tc_info</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsInline</span> <span class='hs-varid'>p</span>     <span class='hs-conop'>:</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tc_info</span> <span class='hs-varid'>i</span> <span class='hs-varop'>`setInlinePragInfo`</span> <span class='hs-varid'>p</span> 
<a name="line-30"></a>    <span class='hs-varid'>tc_info</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsArity</span> <span class='hs-varid'>a</span>      <span class='hs-conop'>:</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tc_info</span> <span class='hs-varid'>i</span> <span class='hs-varop'>`setArityInfo`</span> <span class='hs-varid'>a</span> 
<a name="line-31"></a>    <span class='hs-varid'>tc_info</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsStrictness</span> <span class='hs-varid'>s</span> <span class='hs-conop'>:</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tc_info</span> <span class='hs-varid'>i</span> <span class='hs-varop'>`setAllStrictnessInfo`</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>s</span> 
<a name="line-32"></a>    <span class='hs-varid'>tc_info</span> <span class='hs-layout'>(</span><span class='hs-varid'>other</span>          <span class='hs-conop'>:</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprTrace</span> <span class='hs-str'>"tcIfaceLetBndr: discarding unexpected IdInfo"</span> 
<a name="line-33"></a>					    <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tc_info</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="newExtCoreBndr"></a><span class='hs-comment'>-----------------------</span>
<a name="line-36"></a><span class='hs-definition'>newExtCoreBndr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceLetBndr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>Id</span>
<a name="line-37"></a><span class='hs-definition'>newExtCoreBndr</span> <span class='hs-layout'>(</span><span class='hs-conid'>IfLetBndr</span> <span class='hs-varid'>var</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-comment'>-- Ignoring IdInfo for now</span>
<a name="line-38"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>mod</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getIfModule</span>
<a name="line-39"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newGlobalBinder</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVarOccFS</span> <span class='hs-varid'>var</span><span class='hs-layout'>)</span> <span class='hs-varid'>noSrcSpan</span>
<a name="line-40"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>ty</span>
<a name="line-41"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-42"></a>
<a name="line-43"></a><a name="bindIfaceTyVar"></a><span class='hs-comment'>-----------------------</span>
<a name="line-44"></a><span class='hs-definition'>bindIfaceTyVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceTvBndr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVar</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span>
<a name="line-45"></a><span class='hs-definition'>bindIfaceTyVar</span> <span class='hs-layout'>(</span><span class='hs-varid'>occ</span><span class='hs-layout'>,</span><span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span>
<a name="line-46"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newIfaceName</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVarOccFS</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
<a name="line-47"></a>   	<span class='hs-layout'>;</span> <span class='hs-varid'>tyvar</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mk_iface_tyvar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>kind</span>
<a name="line-48"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>extendIfaceTyVarEnv</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>tyvar</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-varid'>thing_inside</span> <span class='hs-varid'>tyvar</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-49"></a>
<a name="line-50"></a><a name="bindIfaceTyVars"></a><span class='hs-definition'>bindIfaceTyVars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceTvBndr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span>
<a name="line-51"></a><span class='hs-definition'>bindIfaceTyVars</span> <span class='hs-varid'>bndrs</span> <span class='hs-varid'>thing_inside</span>
<a name="line-52"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>names</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newIfaceNames</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>mkTyVarOccFS</span> <span class='hs-varid'>occs</span><span class='hs-layout'>)</span>
<a name="line-53"></a>  	<span class='hs-layout'>;</span> <span class='hs-varid'>tyvars</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zipWithM</span> <span class='hs-varid'>mk_iface_tyvar</span> <span class='hs-varid'>names</span> <span class='hs-varid'>kinds</span>
<a name="line-54"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>extendIfaceTyVarEnv</span> <span class='hs-varid'>tyvars</span> <span class='hs-layout'>(</span><span class='hs-varid'>thing_inside</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-55"></a>  <span class='hs-keyword'>where</span>
<a name="line-56"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>occs</span><span class='hs-layout'>,</span><span class='hs-varid'>kinds</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip</span> <span class='hs-varid'>bndrs</span>
<a name="line-57"></a>
<a name="line-58"></a><a name="mk_iface_tyvar"></a><span class='hs-definition'>mk_iface_tyvar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfaceKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-conid'>TyVar</span>
<a name="line-59"></a><span class='hs-definition'>mk_iface_tyvar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ifKind</span>
<a name="line-60"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcIfaceType</span> <span class='hs-varid'>ifKind</span>
<a name="line-61"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isCoercionKind</span> <span class='hs-varid'>kind</span> <span class='hs-keyword'>then</span> 
<a name="line-62"></a>		<span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkCoVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
<a name="line-63"></a>	  <span class='hs-keyword'>else</span>
<a name="line-64"></a>		<span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkTyVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="bindIfaceTyVars_AT"></a><span class='hs-definition'>bindIfaceTyVars_AT</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceTvBndr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IfL</span> <span class='hs-varid'>a</span>
<a name="line-67"></a><span class='hs-comment'>-- Used for type variable in nested associated data/type declarations</span>
<a name="line-68"></a><span class='hs-comment'>-- where some of the type variables are already in scope</span>
<a name="line-69"></a><span class='hs-comment'>--    class C a where { data T a b }</span>
<a name="line-70"></a><span class='hs-comment'>-- Here 'a' is in scope when we look at the 'data T'</span>
<a name="line-71"></a><span class='hs-definition'>bindIfaceTyVars_AT</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>thing_inside</span>
<a name="line-72"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>thing_inside</span> <span class='hs-conid'>[]</span>
<a name="line-73"></a><span class='hs-definition'>bindIfaceTyVars_AT</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>tv_occ</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>bs</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span> 
<a name="line-74"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindIfaceTyVars_AT</span> <span class='hs-varid'>bs</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>bs'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-75"></a>    <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>mb_tv</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupIfaceTyVar</span> <span class='hs-varid'>tv_occ</span>
<a name="line-76"></a>       <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_tv</span> <span class='hs-keyword'>of</span>
<a name="line-77"></a>      	   <span class='hs-conid'>Just</span> <span class='hs-varid'>b'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>thing_inside</span> <span class='hs-layout'>(</span><span class='hs-varid'>b'</span><span class='hs-conop'>:</span><span class='hs-varid'>bs'</span><span class='hs-layout'>)</span>
<a name="line-78"></a>	   <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>bindIfaceTyVar</span> <span class='hs-varid'>b</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>b'</span> <span class='hs-keyglyph'>-&gt;</span> 
<a name="line-79"></a>	   	      <span class='hs-varid'>thing_inside</span> <span class='hs-layout'>(</span><span class='hs-varid'>b'</span><span class='hs-conop'>:</span><span class='hs-varid'>bs'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code} 

</body>
</html>