Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1751

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>basicTypes/Id.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
%
\section[Id]{@Ids@: Value and constructor identifiers}

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- |</span>
<a name="line-2"></a><span class='hs-comment'>-- #name_types#</span>
<a name="line-3"></a><span class='hs-comment'>-- GHC uses several kinds of name internally:</span>
<a name="line-4"></a><span class='hs-comment'>--</span>
<a name="line-5"></a><span class='hs-comment'>-- * 'OccName.OccName': see "OccName#name_types"</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- * 'RdrName.RdrName': see "RdrName#name_types"</span>
<a name="line-8"></a><span class='hs-comment'>--</span>
<a name="line-9"></a><span class='hs-comment'>-- * 'Name.Name': see "Name#name_types"</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- * 'Id.Id' represents names that not only have a 'Name.Name' but also a 'TypeRep.Type' and some additional</span>
<a name="line-12"></a><span class='hs-comment'>--   details (a 'IdInfo.IdInfo' and one of 'Var.LocalIdDetails' or 'IdInfo.GlobalIdDetails') that</span>
<a name="line-13"></a><span class='hs-comment'>--   are added, modified and inspected by various compiler passes. These 'Var.Var' names may either </span>
<a name="line-14"></a><span class='hs-comment'>--   be global or local, see "Var#globalvslocal"</span>
<a name="line-15"></a><span class='hs-comment'>--</span>
<a name="line-16"></a><span class='hs-comment'>-- * 'Var.Var': see "Var#name_types"</span>
<a name="line-17"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Id</span> <span class='hs-layout'>(</span>
<a name="line-18"></a>        <span class='hs-comment'>-- * The main types</span>
<a name="line-19"></a>	<span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>DictId</span><span class='hs-layout'>,</span>
<a name="line-20"></a>
<a name="line-21"></a>	<span class='hs-comment'>-- ** Simple construction</span>
<a name="line-22"></a>	<span class='hs-varid'>mkGlobalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVanillaGlobal</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVanillaGlobalWithInfo</span><span class='hs-layout'>,</span>
<a name="line-23"></a>	<span class='hs-varid'>mkLocalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkLocalIdWithInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkExportedLocalId</span><span class='hs-layout'>,</span>
<a name="line-24"></a>	<span class='hs-varid'>mkSysLocal</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkSysLocalM</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkUserLocal</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkUserLocalM</span><span class='hs-layout'>,</span>
<a name="line-25"></a>	<span class='hs-varid'>mkTemplateLocals</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTemplateLocalsNum</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTemplateLocal</span><span class='hs-layout'>,</span>
<a name="line-26"></a>	<span class='hs-varid'>mkWorkerId</span><span class='hs-layout'>,</span> 
<a name="line-27"></a>
<a name="line-28"></a>	<span class='hs-comment'>-- ** Taking an Id apart</span>
<a name="line-29"></a>	<span class='hs-varid'>idName</span><span class='hs-layout'>,</span> <span class='hs-varid'>idType</span><span class='hs-layout'>,</span> <span class='hs-varid'>idUnique</span><span class='hs-layout'>,</span> <span class='hs-varid'>idInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>idDetails</span><span class='hs-layout'>,</span>
<a name="line-30"></a>	<span class='hs-varid'>isId</span><span class='hs-layout'>,</span> <span class='hs-varid'>idPrimRep</span><span class='hs-layout'>,</span>
<a name="line-31"></a>	<span class='hs-varid'>recordSelectorFieldLabel</span><span class='hs-layout'>,</span>
<a name="line-32"></a>
<a name="line-33"></a>	<span class='hs-comment'>-- ** Modifying an Id</span>
<a name="line-34"></a>	<span class='hs-varid'>setIdName</span><span class='hs-layout'>,</span> <span class='hs-varid'>setIdUnique</span><span class='hs-layout'>,</span> <span class='hs-conid'>Id</span><span class='hs-varop'>.</span><span class='hs-varid'>setIdType</span><span class='hs-layout'>,</span> 
<a name="line-35"></a>	<span class='hs-varid'>setIdExported</span><span class='hs-layout'>,</span> <span class='hs-varid'>setIdNotExported</span><span class='hs-layout'>,</span> 
<a name="line-36"></a>	<span class='hs-varid'>globaliseId</span><span class='hs-layout'>,</span> <span class='hs-varid'>localiseId</span><span class='hs-layout'>,</span> 
<a name="line-37"></a>	<span class='hs-varid'>setIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>lazySetIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>modifyIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>maybeModifyIdInfo</span><span class='hs-layout'>,</span>
<a name="line-38"></a>	<span class='hs-varid'>zapLamIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapDemandIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapFragileIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>transferPolyIdInfo</span><span class='hs-layout'>,</span>
<a name="line-39"></a>	
<a name="line-40"></a>
<a name="line-41"></a>	<span class='hs-comment'>-- ** Predicates on Ids</span>
<a name="line-42"></a>	<span class='hs-varid'>isImplicitId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDeadBinder</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDictId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isStrictId</span><span class='hs-layout'>,</span>
<a name="line-43"></a>	<span class='hs-varid'>isExportedId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLocalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isGlobalId</span><span class='hs-layout'>,</span>
<a name="line-44"></a>	<span class='hs-varid'>isRecordSelector</span><span class='hs-layout'>,</span> <span class='hs-varid'>isNaughtyRecordSelector</span><span class='hs-layout'>,</span>
<a name="line-45"></a>	<span class='hs-varid'>isClassOpId_maybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDFunId</span><span class='hs-layout'>,</span>
<a name="line-46"></a>	<span class='hs-varid'>isPrimOpId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isPrimOpId_maybe</span><span class='hs-layout'>,</span> 
<a name="line-47"></a>	<span class='hs-varid'>isFCallId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isFCallId_maybe</span><span class='hs-layout'>,</span>
<a name="line-48"></a>	<span class='hs-varid'>isDataConWorkId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDataConWorkId_maybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDataConId_maybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>idDataCon</span><span class='hs-layout'>,</span>
<a name="line-49"></a>        <span class='hs-varid'>isConLikeId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isBottomingId</span><span class='hs-layout'>,</span> <span class='hs-varid'>idIsFrom</span><span class='hs-layout'>,</span>
<a name="line-50"></a>        <span class='hs-varid'>isTickBoxOp</span><span class='hs-layout'>,</span> <span class='hs-varid'>isTickBoxOp_maybe</span><span class='hs-layout'>,</span>
<a name="line-51"></a>	<span class='hs-varid'>hasNoBinding</span><span class='hs-layout'>,</span> 
<a name="line-52"></a>
<a name="line-53"></a>	<span class='hs-comment'>-- ** Inline pragma stuff</span>
<a name="line-54"></a>	<span class='hs-varid'>idInlinePragma</span><span class='hs-layout'>,</span> <span class='hs-varid'>setInlinePragma</span><span class='hs-layout'>,</span> <span class='hs-varid'>modifyInlinePragma</span><span class='hs-layout'>,</span>
<a name="line-55"></a>        <span class='hs-varid'>idInlineActivation</span><span class='hs-layout'>,</span> <span class='hs-varid'>setInlineActivation</span><span class='hs-layout'>,</span> <span class='hs-varid'>idRuleMatchInfo</span><span class='hs-layout'>,</span>
<a name="line-56"></a>
<a name="line-57"></a>	<span class='hs-comment'>-- ** One-shot lambdas</span>
<a name="line-58"></a>	<span class='hs-varid'>isOneShotBndr</span><span class='hs-layout'>,</span> <span class='hs-varid'>isOneShotLambda</span><span class='hs-layout'>,</span> <span class='hs-varid'>isStateHackType</span><span class='hs-layout'>,</span>
<a name="line-59"></a>	<span class='hs-varid'>setOneShotLambda</span><span class='hs-layout'>,</span> <span class='hs-varid'>clearOneShotLambda</span><span class='hs-layout'>,</span>
<a name="line-60"></a>
<a name="line-61"></a>	<span class='hs-comment'>-- ** Reading 'IdInfo' fields</span>
<a name="line-62"></a>	<span class='hs-varid'>idArity</span><span class='hs-layout'>,</span> 
<a name="line-63"></a>	<span class='hs-varid'>idNewDemandInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>idNewDemandInfo_maybe</span><span class='hs-layout'>,</span>
<a name="line-64"></a>	<span class='hs-varid'>idNewStrictness</span><span class='hs-layout'>,</span> <span class='hs-varid'>idNewStrictness_maybe</span><span class='hs-layout'>,</span> 
<a name="line-65"></a>	<span class='hs-varid'>idWorkerInfo</span><span class='hs-layout'>,</span>
<a name="line-66"></a>	<span class='hs-varid'>idUnfolding</span><span class='hs-layout'>,</span>
<a name="line-67"></a>	<span class='hs-varid'>idSpecialisation</span><span class='hs-layout'>,</span> <span class='hs-varid'>idCoreRules</span><span class='hs-layout'>,</span> <span class='hs-varid'>idHasRules</span><span class='hs-layout'>,</span>
<a name="line-68"></a>	<span class='hs-varid'>idCafInfo</span><span class='hs-layout'>,</span>
<a name="line-69"></a>	<span class='hs-varid'>idLBVarInfo</span><span class='hs-layout'>,</span>
<a name="line-70"></a>	<span class='hs-varid'>idOccInfo</span><span class='hs-layout'>,</span>
<a name="line-71"></a>
<a name="line-72"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-73"></a>	<span class='hs-varid'>idDemandInfo</span><span class='hs-layout'>,</span> 
<a name="line-74"></a>	<span class='hs-varid'>idStrictness</span><span class='hs-layout'>,</span> 
<a name="line-75"></a>	<span class='hs-varid'>idCprInfo</span><span class='hs-layout'>,</span>
<a name="line-76"></a><span class='hs-cpp'>#endif</span>
<a name="line-77"></a>
<a name="line-78"></a>	<span class='hs-comment'>-- ** Writing 'IdInfo' fields</span>
<a name="line-79"></a>	<span class='hs-varid'>setIdUnfolding</span><span class='hs-layout'>,</span>
<a name="line-80"></a>	<span class='hs-varid'>setIdArity</span><span class='hs-layout'>,</span>
<a name="line-81"></a>	<span class='hs-varid'>setIdNewDemandInfo</span><span class='hs-layout'>,</span> 
<a name="line-82"></a>	<span class='hs-varid'>setIdNewStrictness</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapIdNewStrictness</span><span class='hs-layout'>,</span>
<a name="line-83"></a>	<span class='hs-varid'>setIdWorkerInfo</span><span class='hs-layout'>,</span>
<a name="line-84"></a>	<span class='hs-varid'>setIdSpecialisation</span><span class='hs-layout'>,</span>
<a name="line-85"></a>	<span class='hs-varid'>setIdCafInfo</span><span class='hs-layout'>,</span>
<a name="line-86"></a>	<span class='hs-varid'>setIdOccInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapIdOccInfo</span><span class='hs-layout'>,</span>
<a name="line-87"></a>
<a name="line-88"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-89"></a>	<span class='hs-varid'>setIdStrictness</span><span class='hs-layout'>,</span> 
<a name="line-90"></a>	<span class='hs-varid'>setIdDemandInfo</span><span class='hs-layout'>,</span> 
<a name="line-91"></a>	<span class='hs-varid'>setIdCprInfo</span><span class='hs-layout'>,</span>
<a name="line-92"></a><span class='hs-cpp'>#endif</span>
<a name="line-93"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-94"></a>
<a name="line-95"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-96"></a>
<a name="line-97"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreSyn</span> <span class='hs-layout'>(</span> <span class='hs-conid'>CoreRule</span><span class='hs-layout'>,</span> <span class='hs-conid'>Unfolding</span> <span class='hs-layout'>)</span>
<a name="line-98"></a>
<a name="line-99"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>IdInfo</span>
<a name="line-100"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-101"></a>
<a name="line-102"></a><span class='hs-comment'>-- Imported and re-exported </span>
<a name="line-103"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span><span class='hs-layout'>(</span> <span class='hs-conid'>Var</span><span class='hs-layout'>,</span> <span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>DictId</span><span class='hs-layout'>,</span>
<a name="line-104"></a>            <span class='hs-varid'>idInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>idDetails</span><span class='hs-layout'>,</span> <span class='hs-varid'>globaliseId</span><span class='hs-layout'>,</span>
<a name="line-105"></a>            <span class='hs-varid'>isId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLocalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isGlobalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isExportedId</span> <span class='hs-layout'>)</span>
<a name="line-106"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Var</span>
<a name="line-107"></a>
<a name="line-108"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-109"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Type</span>
<a name="line-110"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcType</span>
<a name="line-111"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysPrim</span>
<a name="line-112"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-113"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Demand</span>
<a name="line-114"></a><span class='hs-cpp'>#endif</span>
<a name="line-115"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span>
<a name="line-116"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NewDemand</span>
<a name="line-117"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-118"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Module</span>
<a name="line-119"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>
<a name="line-120"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrimOp</span>
<a name="line-121"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ForeignCall</span>
<a name="line-122"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Maybes</span>
<a name="line-123"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-124"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-125"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unique</span>
<a name="line-126"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSupply</span>
<a name="line-127"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-128"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span><span class='hs-layout'>(</span> <span class='hs-varid'>count</span> <span class='hs-layout'>)</span>
<a name="line-129"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>StaticFlags</span>
<a name="line-130"></a>
<a name="line-131"></a><span class='hs-comment'>-- infixl so you can say (id `set` a `set` b)</span>
<a name="line-132"></a><span class='hs-keyword'>infixl</span> 	<span class='hs-num'>1</span> <span class='hs-varop'>`setIdUnfolding`</span><span class='hs-layout'>,</span>
<a name="line-133"></a>	  <span class='hs-varop'>`setIdArity`</span><span class='hs-layout'>,</span>
<a name="line-134"></a>	  <span class='hs-varop'>`setIdNewDemandInfo`</span><span class='hs-layout'>,</span>
<a name="line-135"></a>	  <span class='hs-varop'>`setIdNewStrictness`</span><span class='hs-layout'>,</span>
<a name="line-136"></a>	  <span class='hs-varop'>`setIdWorkerInfo`</span><span class='hs-layout'>,</span>
<a name="line-137"></a>	  <span class='hs-varop'>`setIdSpecialisation`</span><span class='hs-layout'>,</span>
<a name="line-138"></a>	  <span class='hs-varop'>`setInlinePragma`</span><span class='hs-layout'>,</span>
<a name="line-139"></a>	  <span class='hs-varop'>`idCafInfo`</span>
<a name="line-140"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-141"></a>	  <span class='hs-layout'>,</span><span class='hs-varop'>`idCprInfo`</span>
<a name="line-142"></a>	  <span class='hs-layout'>,</span><span class='hs-varop'>`setIdStrictness`</span>
<a name="line-143"></a>	  <span class='hs-layout'>,</span><span class='hs-varop'>`setIdDemandInfo`</span>
<a name="line-144"></a><span class='hs-cpp'>#endif</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Basic Id manipulation}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="idName"></a><span class='hs-definition'>idName</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span>
<a name="line-2"></a><span class='hs-definition'>idName</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>varName</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="idUnique"></a><span class='hs-definition'>idUnique</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Unique</span>
<a name="line-5"></a><span class='hs-definition'>idUnique</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>varUnique</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="idType"></a><span class='hs-definition'>idType</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Kind</span>
<a name="line-8"></a><span class='hs-definition'>idType</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>varType</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="idPrimRep"></a><span class='hs-definition'>idPrimRep</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrimRep</span>
<a name="line-11"></a><span class='hs-definition'>idPrimRep</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>typePrimRep</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="setIdName"></a><span class='hs-definition'>setIdName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-14"></a><span class='hs-definition'>setIdName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setVarName</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="setIdUnique"></a><span class='hs-definition'>setIdUnique</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-17"></a><span class='hs-definition'>setIdUnique</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setVarUnique</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="setIdType"></a><span class='hs-comment'>-- | Not only does this set the 'Id' 'Type', it also evaluates the type to try and</span>
<a name="line-20"></a><span class='hs-comment'>-- reduce space usage</span>
<a name="line-21"></a><span class='hs-definition'>setIdType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-22"></a><span class='hs-definition'>setIdType</span> <span class='hs-varid'>id</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seqType</span> <span class='hs-varid'>ty</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setVarType</span> <span class='hs-varid'>id</span> <span class='hs-varid'>ty</span>
<a name="line-23"></a>
<a name="line-24"></a><a name="setIdExported"></a><span class='hs-definition'>setIdExported</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-25"></a><span class='hs-definition'>setIdExported</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setIdExported</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="setIdNotExported"></a><span class='hs-definition'>setIdNotExported</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-28"></a><span class='hs-definition'>setIdNotExported</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setIdNotExported</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="localiseId"></a><span class='hs-definition'>localiseId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-31"></a><span class='hs-comment'>-- Make an with the same unique and type as the </span>
<a name="line-32"></a><span class='hs-comment'>-- incoming Id, but with an *Internal* Name and *LocalId* flavour</span>
<a name="line-33"></a><span class='hs-definition'>localiseId</span> <span class='hs-varid'>id</span> 
<a name="line-34"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isLocalId</span> <span class='hs-varid'>id</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>isInternalName</span> <span class='hs-varid'>name</span>
<a name="line-35"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-36"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-37"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalIdWithInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>localiseName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-38"></a>  <span class='hs-keyword'>where</span>
<a name="line-39"></a>    <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idName</span> <span class='hs-varid'>id</span>
<a name="line-40"></a>
<a name="line-41"></a><a name="lazySetIdInfo"></a><span class='hs-definition'>lazySetIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-42"></a><span class='hs-definition'>lazySetIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>lazySetIdInfo</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="setIdInfo"></a><span class='hs-definition'>setIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-45"></a><span class='hs-definition'>setIdInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seqIdInfo</span> <span class='hs-varid'>info</span> <span class='hs-varop'>`seq`</span> <span class='hs-layout'>(</span><span class='hs-varid'>lazySetIdInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>
<a name="line-46"></a>        <span class='hs-comment'>-- Try to avoid spack leaks by seq'ing</span>
<a name="line-47"></a>
<a name="line-48"></a><a name="modifyIdInfo"></a><span class='hs-definition'>modifyIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-49"></a><span class='hs-definition'>modifyIdInfo</span> <span class='hs-varid'>fn</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setIdInfo</span> <span class='hs-varid'>id</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-50"></a>
<a name="line-51"></a><a name="maybeModifyIdInfo"></a><span class='hs-comment'>-- maybeModifyIdInfo tries to avoid unnecesary thrashing</span>
<a name="line-52"></a><span class='hs-definition'>maybeModifyIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-53"></a><span class='hs-definition'>maybeModifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>new_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lazySetIdInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>new_info</span>
<a name="line-54"></a><span class='hs-definition'>maybeModifyIdInfo</span> <span class='hs-conid'>Nothing</span>	  <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Simple Id construction}
%*									*
%************************************************************************

Absolutely all Ids are made by mkId.  It is just like Var.mkId,
but in addition it pins free-tyvar-info onto the Id's type, 
where it can easily be found.

Note [Free type variables]
~~~~~~~~~~~~~~~~~~~~~~~~~~
At one time we cached the free type variables of the type of an Id
at the root of the type in a TyNote.  The idea was to avoid repeating
the free-type-variable calculation.  But it turned out to slow down
the compiler overall. I don't quite know why; perhaps finding free
type variables of an Id isn't all that common whereas applying a 
substitution (which changes the free type variables) is more common.
Anyway, we removed it in March 2008.

\begin{code}
<pre><a name="line-1"></a><a name="mkGlobalId"></a><span class='hs-comment'>-- | For an explanation of global vs. local 'Id's, see "Var#globalvslocal"</span>
<a name="line-2"></a><span class='hs-definition'>mkGlobalId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdDetails</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'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-3"></a><span class='hs-definition'>mkGlobalId</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkGlobalVar</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="mkVanillaGlobal"></a><span class='hs-comment'>-- | Make a global 'Id' without any extra information at all</span>
<a name="line-6"></a><span class='hs-definition'>mkVanillaGlobal</span> <span class='hs-keyglyph'>::</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'>Id</span>
<a name="line-7"></a><span class='hs-definition'>mkVanillaGlobal</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkVanillaGlobalWithInfo</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>vanillaIdInfo</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="mkVanillaGlobalWithInfo"></a><span class='hs-comment'>-- | Make a global 'Id' with no global information but some generic 'IdInfo'</span>
<a name="line-10"></a><span class='hs-definition'>mkVanillaGlobalWithInfo</span> <span class='hs-keyglyph'>::</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'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-11"></a><span class='hs-definition'>mkVanillaGlobalWithInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkGlobalId</span> <span class='hs-conid'>VanillaId</span>
<a name="line-12"></a>
<a name="line-13"></a>
<a name="line-14"></a><a name="mkLocalId"></a><span class='hs-comment'>-- | For an explanation of global vs. local 'Id's, see "Var#globalvslocal"</span>
<a name="line-15"></a><span class='hs-definition'>mkLocalId</span> <span class='hs-keyglyph'>::</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'>Id</span>
<a name="line-16"></a><span class='hs-definition'>mkLocalId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalIdWithInfo</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>vanillaIdInfo</span>
<a name="line-17"></a>
<a name="line-18"></a><a name="mkLocalIdWithInfo"></a><span class='hs-definition'>mkLocalIdWithInfo</span> <span class='hs-keyglyph'>::</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'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-19"></a><span class='hs-definition'>mkLocalIdWithInfo</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkLocalVar</span> <span class='hs-conid'>VanillaId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span>
<a name="line-20"></a>	<span class='hs-comment'>-- Note [Free type variables]</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="mkExportedLocalId"></a><span class='hs-comment'>-- | Create a local 'Id' that is marked as exported. </span>
<a name="line-23"></a><span class='hs-comment'>-- This prevents things attached to it from being removed as dead code.</span>
<a name="line-24"></a><span class='hs-definition'>mkExportedLocalId</span> <span class='hs-keyglyph'>::</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'>Id</span>
<a name="line-25"></a><span class='hs-definition'>mkExportedLocalId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkExportedLocalVar</span> <span class='hs-conid'>VanillaId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>vanillaIdInfo</span>
<a name="line-26"></a>	<span class='hs-comment'>-- Note [Free type variables]</span>
<a name="line-27"></a>
<a name="line-28"></a>
<a name="line-29"></a><a name="mkSysLocal"></a><span class='hs-comment'>-- | Create a system local 'Id'. These are local 'Id's (see "Var#globalvslocal") </span>
<a name="line-30"></a><span class='hs-comment'>-- that are created by the compiler out of thin air</span>
<a name="line-31"></a><span class='hs-definition'>mkSysLocal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-32"></a><span class='hs-definition'>mkSysLocal</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSystemVarName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-33"></a>
<a name="line-34"></a><a name="mkSysLocalM"></a><span class='hs-definition'>mkSysLocalM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadUnique</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Id</span>
<a name="line-35"></a><span class='hs-definition'>mkSysLocalM</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getUniqueM</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSysLocal</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-36"></a>
<a name="line-37"></a>
<a name="line-38"></a><a name="mkUserLocal"></a><span class='hs-comment'>-- | Create a user local 'Id'. These are local 'Id's (see "Var#globalvslocal") with a name and location that the user might recognize</span>
<a name="line-39"></a><span class='hs-definition'>mkUserLocal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-40"></a><span class='hs-definition'>mkUserLocal</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkInternalName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>loc</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="mkUserLocalM"></a><span class='hs-definition'>mkUserLocalM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadUnique</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Id</span>
<a name="line-43"></a><span class='hs-definition'>mkUserLocalM</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getUniqueM</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkUserLocal</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>loc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-44"></a>
</pre>\end{code}

Make some local @Ids@ for a template @CoreExpr@.  These have bogus
@Uniques@, but that's OK because the templates are supposed to be
instantiated before use.
 
\begin{code}
<pre><a name="line-1"></a><a name="mkWorkerId"></a><span class='hs-comment'>-- | Workers get local names. "CoreTidy" will externalise these if necessary</span>
<a name="line-2"></a><span class='hs-definition'>mkWorkerId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-3"></a><span class='hs-definition'>mkWorkerId</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>unwrkr</span> <span class='hs-varid'>ty</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>wkr_name</span> <span class='hs-varid'>ty</span>
<a name="line-5"></a>  <span class='hs-keyword'>where</span>
<a name="line-6"></a>    <span class='hs-varid'>wkr_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkInternalName</span> <span class='hs-varid'>uniq</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkWorkerOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>getOccName</span> <span class='hs-varid'>unwrkr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>getSrcSpan</span> <span class='hs-varid'>unwrkr</span><span class='hs-layout'>)</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="mkTemplateLocal"></a><span class='hs-comment'>-- | Create a /template local/: a family of system local 'Id's in bijection with @Int@s, typically used in unfoldings</span>
<a name="line-9"></a><span class='hs-definition'>mkTemplateLocal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-10"></a><span class='hs-definition'>mkTemplateLocal</span> <span class='hs-varid'>i</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSysLocal</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"tpl"</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkBuiltinUnique</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="mkTemplateLocals"></a><span class='hs-comment'>-- | Create a template local for a series of types</span>
<a name="line-13"></a><span class='hs-definition'>mkTemplateLocals</span> <span class='hs-keyglyph'>::</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'>Id</span><span class='hs-keyglyph'>]</span>
<a name="line-14"></a><span class='hs-definition'>mkTemplateLocals</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTemplateLocalsNum</span> <span class='hs-num'>1</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="mkTemplateLocalsNum"></a><span class='hs-comment'>-- | Create a template local for a series of type, but start from a specified template local</span>
<a name="line-17"></a><span class='hs-definition'>mkTemplateLocalsNum</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</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'>Id</span><span class='hs-keyglyph'>]</span>
<a name="line-18"></a><span class='hs-definition'>mkTemplateLocalsNum</span> <span class='hs-varid'>n</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zipWith</span> <span class='hs-varid'>mkTemplateLocal</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>n</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>tys</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Special Ids}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="recordSelectorFieldLabel"></a><span class='hs-comment'>-- | If the 'Id' is that for a record selector, extract the 'sel_tycon' and label. Panic otherwise</span>
<a name="line-2"></a><span class='hs-definition'>recordSelectorFieldLabel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</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-conid'>FieldLabel</span><span class='hs-layout'>)</span>
<a name="line-3"></a><span class='hs-definition'>recordSelectorFieldLabel</span> <span class='hs-varid'>id</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-5"></a>        <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'>tycon</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>idName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-6"></a>        <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"recordSelectorFieldLabel"</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="isRecordSelector"></a><span class='hs-definition'>isRecordSelector</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-9"></a><a name="isNaughtyRecordSelector"></a><span class='hs-definition'>isNaughtyRecordSelector</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-10"></a><a name="isPrimOpId"></a><span class='hs-definition'>isPrimOpId</span>              <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-11"></a><a name="isFCallId"></a><span class='hs-definition'>isFCallId</span>               <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-12"></a><a name="isDataConWorkId"></a><span class='hs-definition'>isDataConWorkId</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-13"></a><a name="isDFunId"></a><span class='hs-definition'>isDFunId</span>                <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="isClassOpId_maybe"></a><span class='hs-definition'>isClassOpId_maybe</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Class</span>
<a name="line-16"></a><a name="isPrimOpId_maybe"></a><span class='hs-definition'>isPrimOpId_maybe</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>PrimOp</span>
<a name="line-17"></a><a name="isFCallId_maybe"></a><span class='hs-definition'>isFCallId_maybe</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>ForeignCall</span>
<a name="line-18"></a><a name="isDataConWorkId_maybe"></a><span class='hs-definition'>isDataConWorkId_maybe</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>DataCon</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-definition'>isRecordSelector</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-21"></a>                        <span class='hs-conid'>RecSelId</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-22"></a>                        <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-23"></a>
<a name="line-24"></a><span class='hs-definition'>isNaughtyRecordSelector</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-25"></a>                        <span class='hs-conid'>RecSelId</span> <span class='hs-layout'>{</span> <span class='hs-varid'>sel_naughty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>n</span>
<a name="line-26"></a>                        <span class='hs-keyword'>_</span>                               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-27"></a>
<a name="line-28"></a><span class='hs-definition'>isClassOpId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-29"></a>			<span class='hs-conid'>ClassOpId</span> <span class='hs-varid'>cls</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>cls</span>
<a name="line-30"></a>			<span class='hs-sel'>_other</span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-definition'>isPrimOpId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-33"></a>                        <span class='hs-conid'>PrimOpId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-34"></a>                        <span class='hs-keyword'>_</span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-definition'>isDFunId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-37"></a>                        <span class='hs-conid'>DFunId</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-38"></a>                        <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-39"></a>
<a name="line-40"></a><span class='hs-definition'>isPrimOpId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-41"></a>                        <span class='hs-conid'>PrimOpId</span> <span class='hs-varid'>op</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>op</span>
<a name="line-42"></a>                        <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-43"></a>
<a name="line-44"></a><span class='hs-definition'>isFCallId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-45"></a>                        <span class='hs-conid'>FCallId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-46"></a>                        <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-definition'>isFCallId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-49"></a>                        <span class='hs-conid'>FCallId</span> <span class='hs-varid'>call</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>call</span>
<a name="line-50"></a>                        <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-51"></a>
<a name="line-52"></a><span class='hs-definition'>isDataConWorkId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-53"></a>                        <span class='hs-conid'>DataConWorkId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-54"></a>                        <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-55"></a>
<a name="line-56"></a><span class='hs-definition'>isDataConWorkId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-57"></a>                        <span class='hs-conid'>DataConWorkId</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>con</span>
<a name="line-58"></a>                        <span class='hs-keyword'>_</span>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-59"></a>
<a name="line-60"></a><a name="isDataConId_maybe"></a><span class='hs-definition'>isDataConId_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>DataCon</span>
<a name="line-61"></a><span class='hs-definition'>isDataConId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-62"></a>                         <span class='hs-conid'>DataConWorkId</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>con</span>
<a name="line-63"></a>                         <span class='hs-conid'>DataConWrapId</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>con</span>
<a name="line-64"></a>                         <span class='hs-keyword'>_</span>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="idDataCon"></a><span class='hs-definition'>idDataCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DataCon</span>
<a name="line-67"></a><span class='hs-comment'>-- ^ Get from either the worker or the wrapper 'Id' to the 'DataCon'. Currently used only in the desugarer.</span>
<a name="line-68"></a><span class='hs-comment'>--</span>
<a name="line-69"></a><span class='hs-comment'>-- INVARIANT: @idDataCon (dataConWrapId d) = d@: remember, 'dataConWrapId' can return either the wrapper or the worker</span>
<a name="line-70"></a><span class='hs-definition'>idDataCon</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDataConId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-varop'>`orElse`</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"idDataCon"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-71"></a>
<a name="line-72"></a>
<a name="line-73"></a><a name="isDictId"></a><span class='hs-definition'>isDictId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-74"></a><span class='hs-definition'>isDictId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDictTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-75"></a>
<a name="line-76"></a><a name="hasNoBinding"></a><span class='hs-definition'>hasNoBinding</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-77"></a><span class='hs-comment'>-- ^ Returns @True@ of an 'Id' which may not have a</span>
<a name="line-78"></a><span class='hs-comment'>-- binding, even though it is defined in this module.</span>
<a name="line-79"></a>
<a name="line-80"></a><span class='hs-comment'>-- Data constructor workers used to be things of this kind, but</span>
<a name="line-81"></a><span class='hs-comment'>-- they aren't any more.  Instead, we inject a binding for </span>
<a name="line-82"></a><span class='hs-comment'>-- them at the CorePrep stage. </span>
<a name="line-83"></a><span class='hs-comment'>-- EXCEPT: unboxed tuples, which definitely have no binding</span>
<a name="line-84"></a><span class='hs-definition'>hasNoBinding</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-85"></a>			<span class='hs-conid'>PrimOpId</span> <span class='hs-keyword'>_</span>  	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>	<span class='hs-comment'>-- See Note [Primop wrappers]</span>
<a name="line-86"></a>			<span class='hs-conid'>FCallId</span> <span class='hs-keyword'>_</span>   	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-87"></a>			<span class='hs-conid'>DataConWorkId</span> <span class='hs-varid'>dc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>isUnboxedTupleCon</span> <span class='hs-varid'>dc</span>
<a name="line-88"></a>			<span class='hs-keyword'>_</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-89"></a>
<a name="line-90"></a><a name="isImplicitId"></a><span class='hs-definition'>isImplicitId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-91"></a><span class='hs-comment'>-- ^ 'isImplicitId' tells whether an 'Id's info is implied by other</span>
<a name="line-92"></a><span class='hs-comment'>-- declarations, so we don't need to put its signature in an interface</span>
<a name="line-93"></a><span class='hs-comment'>-- file, even if it's mentioned in some other interface unfolding.</span>
<a name="line-94"></a><span class='hs-definition'>isImplicitId</span> <span class='hs-varid'>id</span>
<a name="line-95"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-96"></a>        <span class='hs-conid'>FCallId</span> <span class='hs-keyword'>_</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-97"></a>	<span class='hs-conid'>ClassOpId</span> <span class='hs-keyword'>_</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-98"></a>        <span class='hs-conid'>PrimOpId</span> <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-99"></a>        <span class='hs-conid'>DataConWorkId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-100"></a>	<span class='hs-conid'>DataConWrapId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-101"></a>		<span class='hs-comment'>-- These are are implied by their type or class decl;</span>
<a name="line-102"></a>		<span class='hs-comment'>-- remember that all type and class decls appear in the interface file.</span>
<a name="line-103"></a>		<span class='hs-comment'>-- The dfun id is not an implicit Id; it must *not* be omitted, because </span>
<a name="line-104"></a>		<span class='hs-comment'>-- it carries version info for the instance decl</span>
<a name="line-105"></a>        <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-106"></a>
<a name="line-107"></a><a name="idIsFrom"></a><span class='hs-definition'>idIsFrom</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Module</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-108"></a><span class='hs-definition'>idIsFrom</span> <span class='hs-varid'>mod</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nameIsLocalOrFrom</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>idName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
</pre>\end{code}

Note [Primop wrappers]
~~~~~~~~~~~~~~~~~~~~~~
Currently hasNoBinding claims that PrimOpIds don't have a curried
function definition.  But actually they do, in GHC.PrimopWrappers,
which is auto-generated from prelude/primops.txt.pp.  So actually, hasNoBinding
could return 'False' for PrimOpIds.

But we'd need to add something in CoreToStg to swizzle any unsaturated
applications of GHC.Prim.plusInt# to GHC.PrimopWrappers.plusInt#.

Nota Bene: GHC.PrimopWrappers is needed *regardless*, because it's
used by GHCi, which does not implement primops direct at all.



\begin{code}
<pre><a name="line-1"></a><a name="isDeadBinder"></a><span class='hs-definition'>isDeadBinder</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-2"></a><span class='hs-definition'>isDeadBinder</span> <span class='hs-varid'>bndr</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isId</span> <span class='hs-varid'>bndr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDeadOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>idOccInfo</span> <span class='hs-varid'>bndr</span><span class='hs-layout'>)</span>
<a name="line-3"></a>		  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>	<span class='hs-comment'>-- TyVars count as not dead</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="isTickBoxOp"></a><span class='hs-definition'>isTickBoxOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-2"></a><span class='hs-definition'>isTickBoxOp</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> 
<a name="line-3"></a>  <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-4"></a>    <span class='hs-conid'>TickBoxOpId</span> <span class='hs-keyword'>_</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-5"></a>    <span class='hs-keyword'>_</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="isTickBoxOp_maybe"></a><span class='hs-definition'>isTickBoxOp_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>TickBoxOp</span>
<a name="line-8"></a><span class='hs-definition'>isTickBoxOp_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> 
<a name="line-9"></a>  <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-10"></a>    <span class='hs-conid'>TickBoxOpId</span> <span class='hs-varid'>tick</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>tick</span>
<a name="line-11"></a>    <span class='hs-keyword'>_</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{IdInfo stuff}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-2"></a>	<span class='hs-comment'>-- ARITY</span>
<a name="line-3"></a><a name="idArity"></a><span class='hs-definition'>idArity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Arity</span>
<a name="line-4"></a><span class='hs-definition'>idArity</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>arityInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="setIdArity"></a><span class='hs-definition'>setIdArity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Arity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-7"></a><span class='hs-definition'>setIdArity</span> <span class='hs-varid'>id</span> <span class='hs-varid'>arity</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setArityInfo`</span> <span class='hs-varid'>arity</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-10"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-11"></a>	<span class='hs-comment'>-- (OLD) STRICTNESS </span>
<a name="line-12"></a><a name="idStrictness"></a><span class='hs-definition'>idStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>StrictnessInfo</span>
<a name="line-13"></a><span class='hs-definition'>idStrictness</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictnessInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="setIdStrictness"></a><span class='hs-definition'>setIdStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>StrictnessInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-16"></a><span class='hs-definition'>setIdStrictness</span> <span class='hs-varid'>id</span> <span class='hs-varid'>strict_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setStrictnessInfo`</span> <span class='hs-varid'>strict_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-17"></a><span class='hs-cpp'>#endif</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="isBottomingId"></a><span class='hs-comment'>-- | Returns true if an application to n args would diverge</span>
<a name="line-20"></a><span class='hs-definition'>isBottomingId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-21"></a><span class='hs-definition'>isBottomingId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isBottomingSig</span> <span class='hs-layout'>(</span><span class='hs-varid'>idNewStrictness</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="idNewStrictness_maybe"></a><span class='hs-definition'>idNewStrictness_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>StrictSig</span>
<a name="line-24"></a><a name="idNewStrictness"></a><span class='hs-definition'>idNewStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>StrictSig</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-definition'>idNewStrictness_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newStrictnessInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-27"></a><span class='hs-definition'>idNewStrictness</span>       <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idNewStrictness_maybe</span> <span class='hs-varid'>id</span> <span class='hs-varop'>`orElse`</span> <span class='hs-varid'>topSig</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="setIdNewStrictness"></a><span class='hs-definition'>setIdNewStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>StrictSig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-30"></a><span class='hs-definition'>setIdNewStrictness</span> <span class='hs-varid'>id</span> <span class='hs-varid'>sig</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setNewStrictnessInfo`</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>sig</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="zapIdNewStrictness"></a><span class='hs-definition'>zapIdNewStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-33"></a><span class='hs-definition'>zapIdNewStrictness</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setNewStrictnessInfo`</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="isStrictId"></a><span class='hs-comment'>-- | This predicate says whether the 'Id' has a strict demand placed on it or</span>
<a name="line-36"></a><span class='hs-comment'>-- has a type such that it can always be evaluated strictly (e.g., an</span>
<a name="line-37"></a><span class='hs-comment'>-- unlifted type, but see the comment for 'isStrictType').  We need to</span>
<a name="line-38"></a><span class='hs-comment'>-- check separately whether the 'Id' has a so-called \"strict type\" because if</span>
<a name="line-39"></a><span class='hs-comment'>-- the demand for the given @id@ hasn't been computed yet but @id@ has a strict</span>
<a name="line-40"></a><span class='hs-comment'>-- type, we still want @isStrictId id@ to be @True@.</span>
<a name="line-41"></a><span class='hs-definition'>isStrictId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-42"></a><span class='hs-definition'>isStrictId</span> <span class='hs-varid'>id</span>
<a name="line-43"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>isId</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span> <span class='hs-str'>"isStrictId: not an id: "</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>id</span> <span class='hs-layout'>)</span>
<a name="line-44"></a>           <span class='hs-layout'>(</span><span class='hs-varid'>isStrictDmd</span> <span class='hs-layout'>(</span><span class='hs-varid'>idNewDemandInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> 
<a name="line-45"></a>           <span class='hs-layout'>(</span><span class='hs-varid'>isStrictType</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-46"></a>
<a name="line-47"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-48"></a>	<span class='hs-comment'>-- WORKER ID</span>
<a name="line-49"></a><a name="idWorkerInfo"></a><span class='hs-definition'>idWorkerInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WorkerInfo</span>
<a name="line-50"></a><span class='hs-definition'>idWorkerInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>workerInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="setIdWorkerInfo"></a><span class='hs-definition'>setIdWorkerInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-53"></a><span class='hs-definition'>setIdWorkerInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>work_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setWorkerInfo`</span> <span class='hs-varid'>work_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-54"></a>
<a name="line-55"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-56"></a>	<span class='hs-comment'>-- UNFOLDING</span>
<a name="line-57"></a><a name="idUnfolding"></a><span class='hs-definition'>idUnfolding</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Unfolding</span>
<a name="line-58"></a><span class='hs-definition'>idUnfolding</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unfoldingInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-59"></a>
<a name="line-60"></a><a name="setIdUnfolding"></a><span class='hs-definition'>setIdUnfolding</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Unfolding</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-61"></a><span class='hs-definition'>setIdUnfolding</span> <span class='hs-varid'>id</span> <span class='hs-varid'>unfolding</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setUnfoldingInfo`</span> <span class='hs-varid'>unfolding</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-62"></a>
<a name="line-63"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-64"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-65"></a>	<span class='hs-comment'>-- (OLD) DEMAND</span>
<a name="line-66"></a><a name="idDemandInfo"></a><span class='hs-definition'>idDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span>
<a name="line-67"></a><span class='hs-definition'>idDemandInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>demandInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-68"></a>
<a name="line-69"></a><a name="setIdDemandInfo"></a><span class='hs-definition'>setIdDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-70"></a><span class='hs-definition'>setIdDemandInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>demand_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setDemandInfo`</span> <span class='hs-varid'>demand_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-71"></a><span class='hs-cpp'>#endif</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="idNewDemandInfo_maybe"></a><span class='hs-definition'>idNewDemandInfo_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span>
<a name="line-74"></a><a name="idNewDemandInfo"></a><span class='hs-definition'>idNewDemandInfo</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span>
<a name="line-75"></a>
<a name="line-76"></a><span class='hs-definition'>idNewDemandInfo_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newDemandInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-77"></a><span class='hs-definition'>idNewDemandInfo</span>       <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newDemandInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-varop'>`orElse`</span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-varid'>topDmd</span>
<a name="line-78"></a>
<a name="line-79"></a><a name="setIdNewDemandInfo"></a><span class='hs-definition'>setIdNewDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-80"></a><span class='hs-definition'>setIdNewDemandInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>dmd</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setNewDemandInfo`</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>dmd</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-81"></a>
<a name="line-82"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-83"></a>	<span class='hs-comment'>-- SPECIALISATION</span>
<a name="line-84"></a><a name="idSpecialisation"></a><span class='hs-definition'>idSpecialisation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SpecInfo</span>
<a name="line-85"></a><span class='hs-definition'>idSpecialisation</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>specInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-86"></a>
<a name="line-87"></a><a name="idCoreRules"></a><span class='hs-definition'>idCoreRules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreRule</span><span class='hs-keyglyph'>]</span>
<a name="line-88"></a><span class='hs-definition'>idCoreRules</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>specInfoRules</span> <span class='hs-layout'>(</span><span class='hs-varid'>idSpecialisation</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-89"></a>
<a name="line-90"></a><a name="idHasRules"></a><span class='hs-definition'>idHasRules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-91"></a><span class='hs-definition'>idHasRules</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isEmptySpecInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idSpecialisation</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-92"></a>
<a name="line-93"></a><a name="setIdSpecialisation"></a><span class='hs-definition'>setIdSpecialisation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-94"></a><span class='hs-definition'>setIdSpecialisation</span> <span class='hs-varid'>id</span> <span class='hs-varid'>spec_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setSpecInfo`</span> <span class='hs-varid'>spec_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-95"></a>
<a name="line-96"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-97"></a>	<span class='hs-comment'>-- CAF INFO</span>
<a name="line-98"></a><a name="idCafInfo"></a><span class='hs-definition'>idCafInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CafInfo</span>
<a name="line-99"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-100"></a><span class='hs-definition'>idCafInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>cgInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-101"></a>		  <span class='hs-conid'>NoCgInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"idCafInfo"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-102"></a>		  <span class='hs-varid'>info</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cgCafInfo</span> <span class='hs-varid'>info</span>
<a name="line-103"></a><span class='hs-cpp'>#else</span>
<a name="line-104"></a><span class='hs-definition'>idCafInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cafInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-105"></a><span class='hs-cpp'>#endif</span>
<a name="line-106"></a>
<a name="line-107"></a><a name="setIdCafInfo"></a><span class='hs-definition'>setIdCafInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CafInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-108"></a><span class='hs-definition'>setIdCafInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>caf_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setCafInfo`</span> <span class='hs-varid'>caf_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-109"></a>
<a name="line-110"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-111"></a>	<span class='hs-comment'>-- CPR INFO</span>
<a name="line-112"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-113"></a><a name="idCprInfo"></a><span class='hs-definition'>idCprInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CprInfo</span>
<a name="line-114"></a><span class='hs-definition'>idCprInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cprInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-115"></a>
<a name="line-116"></a><a name="setIdCprInfo"></a><span class='hs-definition'>setIdCprInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CprInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-117"></a><span class='hs-definition'>setIdCprInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>cpr_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setCprInfo`</span> <span class='hs-varid'>cpr_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-118"></a><span class='hs-cpp'>#endif</span>
<a name="line-119"></a>
<a name="line-120"></a>	<span class='hs-comment'>---------------------------------</span>
<a name="line-121"></a>	<span class='hs-comment'>-- Occcurrence INFO</span>
<a name="line-122"></a><a name="idOccInfo"></a><span class='hs-definition'>idOccInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccInfo</span>
<a name="line-123"></a><span class='hs-definition'>idOccInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-124"></a>
<a name="line-125"></a><a name="setIdOccInfo"></a><span class='hs-definition'>setIdOccInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-126"></a><span class='hs-definition'>setIdOccInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>occ_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setOccInfo`</span> <span class='hs-varid'>occ_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-127"></a>
<a name="line-128"></a><a name="zapIdOccInfo"></a><span class='hs-definition'>zapIdOccInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-129"></a><span class='hs-definition'>zapIdOccInfo</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span> <span class='hs-varop'>`setIdOccInfo`</span> <span class='hs-conid'>NoOccInfo</span>
</pre>\end{code}


	---------------------------------
	-- INLINING
The inline pragma tells us to be very keen to inline this Id, but it's still
OK not to if optimisation is switched off.

\begin{code}
<pre><a name="line-1"></a><a name="idInlinePragma"></a><span class='hs-definition'>idInlinePragma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InlinePragma</span>
<a name="line-2"></a><span class='hs-definition'>idInlinePragma</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePragInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="setInlinePragma"></a><span class='hs-definition'>setInlinePragma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-5"></a><span class='hs-definition'>setInlinePragma</span> <span class='hs-varid'>id</span> <span class='hs-varid'>prag</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setInlinePragInfo`</span> <span class='hs-varid'>prag</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="modifyInlinePragma"></a><span class='hs-definition'>modifyInlinePragma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InlinePragma</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-8"></a><span class='hs-definition'>modifyInlinePragma</span> <span class='hs-varid'>id</span> <span class='hs-varid'>fn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>info</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>info</span> <span class='hs-varop'>`setInlinePragInfo`</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn</span> <span class='hs-layout'>(</span><span class='hs-varid'>inlinePragInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="idInlineActivation"></a><span class='hs-definition'>idInlineActivation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Activation</span>
<a name="line-11"></a><span class='hs-definition'>idInlineActivation</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePragmaActivation</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInlinePragma</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="setInlineActivation"></a><span class='hs-definition'>setInlineActivation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Activation</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-14"></a><span class='hs-definition'>setInlineActivation</span> <span class='hs-varid'>id</span> <span class='hs-varid'>act</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyInlinePragma</span> <span class='hs-varid'>id</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>act</span> <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="idRuleMatchInfo"></a><span class='hs-definition'>idRuleMatchInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RuleMatchInfo</span>
<a name="line-17"></a><span class='hs-definition'>idRuleMatchInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePragmaRuleMatchInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInlinePragma</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="isConLikeId"></a><span class='hs-definition'>isConLikeId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-20"></a><span class='hs-definition'>isConLikeId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDataConWorkId</span> <span class='hs-varid'>id</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isConLike</span> <span class='hs-layout'>(</span><span class='hs-varid'>idRuleMatchInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
</pre>\end{code}


	---------------------------------
	-- ONE-SHOT LAMBDAS
\begin{code}
<pre><a name="line-1"></a><a name="idLBVarInfo"></a><span class='hs-definition'>idLBVarInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LBVarInfo</span>
<a name="line-2"></a><span class='hs-definition'>idLBVarInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lbvarInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="isOneShotBndr"></a><span class='hs-comment'>-- | Returns whether the lambda associated with the 'Id' is certainly applied at most once</span>
<a name="line-5"></a><span class='hs-comment'>-- OR we are applying the \"state hack\" which makes it appear as if theis is the case for</span>
<a name="line-6"></a><span class='hs-comment'>-- lambdas used in @IO@. You should prefer using this over 'isOneShotLambda'</span>
<a name="line-7"></a><span class='hs-definition'>isOneShotBndr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-8"></a><span class='hs-comment'>-- This one is the "business end", called externally.</span>
<a name="line-9"></a><span class='hs-comment'>-- Its main purpose is to encapsulate the Horrible State Hack</span>
<a name="line-10"></a><span class='hs-definition'>isOneShotBndr</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isOneShotLambda</span> <span class='hs-varid'>id</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isStateHackType</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="isStateHackType"></a><span class='hs-comment'>-- | Should we apply the state hack to values of this 'Type'?</span>
<a name="line-13"></a><span class='hs-definition'>isStateHackType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-14"></a><span class='hs-definition'>isStateHackType</span> <span class='hs-varid'>ty</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>opt_NoStateHack</span> 
<a name="line-16"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-17"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-18"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>splitTyConApp_maybe</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>of</span>
<a name="line-19"></a>	<span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tycon</span> <span class='hs-varop'>==</span> <span class='hs-varid'>statePrimTyCon</span>
<a name="line-20"></a>        <span class='hs-keyword'>_</span>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-21"></a>	<span class='hs-comment'>-- This is a gross hack.  It claims that </span>
<a name="line-22"></a>	<span class='hs-comment'>-- every function over realWorldStatePrimTy is a one-shot</span>
<a name="line-23"></a>	<span class='hs-comment'>-- function.  This is pretty true in practice, and makes a big</span>
<a name="line-24"></a>	<span class='hs-comment'>-- difference.  For example, consider</span>
<a name="line-25"></a>	<span class='hs-comment'>--	a `thenST` \ r -&gt; ...E...</span>
<a name="line-26"></a>	<span class='hs-comment'>-- The early full laziness pass, if it doesn't know that r is one-shot</span>
<a name="line-27"></a>	<span class='hs-comment'>-- will pull out E (let's say it doesn't mention r) to give</span>
<a name="line-28"></a>	<span class='hs-comment'>--	let lvl = E in a `thenST` \ r -&gt; ...lvl...</span>
<a name="line-29"></a>	<span class='hs-comment'>-- When `thenST` gets inlined, we end up with</span>
<a name="line-30"></a>	<span class='hs-comment'>--	let lvl = E in \s -&gt; case a s of (r, s') -&gt; ...lvl...</span>
<a name="line-31"></a>	<span class='hs-comment'>-- and we don't re-inline E.</span>
<a name="line-32"></a>	<span class='hs-comment'>--</span>
<a name="line-33"></a>	<span class='hs-comment'>-- It would be better to spot that r was one-shot to start with, but</span>
<a name="line-34"></a>	<span class='hs-comment'>-- I don't want to rely on that.</span>
<a name="line-35"></a>	<span class='hs-comment'>--</span>
<a name="line-36"></a>	<span class='hs-comment'>-- Another good example is in fill_in in PrelPack.lhs.  We should be able to</span>
<a name="line-37"></a>	<span class='hs-comment'>-- spot that fill_in has arity 2 (and when Keith is done, we will) but we can't yet.</span>
<a name="line-38"></a>
<a name="line-39"></a>
<a name="line-40"></a><a name="isOneShotLambda"></a><span class='hs-comment'>-- | Returns whether the lambda associated with the 'Id' is certainly applied at most once.</span>
<a name="line-41"></a><span class='hs-comment'>-- You probably want to use 'isOneShotBndr' instead</span>
<a name="line-42"></a><span class='hs-definition'>isOneShotLambda</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-43"></a><span class='hs-definition'>isOneShotLambda</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>idLBVarInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-44"></a>                       <span class='hs-conid'>IsOneShotLambda</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-45"></a>                       <span class='hs-conid'>NoLBVarInfo</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="setOneShotLambda"></a><span class='hs-definition'>setOneShotLambda</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-48"></a><span class='hs-definition'>setOneShotLambda</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setLBVarInfo`</span> <span class='hs-conid'>IsOneShotLambda</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-49"></a>
<a name="line-50"></a><a name="clearOneShotLambda"></a><span class='hs-definition'>clearOneShotLambda</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-51"></a><span class='hs-definition'>clearOneShotLambda</span> <span class='hs-varid'>id</span> 
<a name="line-52"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isOneShotLambda</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setLBVarInfo`</span> <span class='hs-conid'>NoLBVarInfo</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-53"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>			
<a name="line-54"></a>
<a name="line-55"></a><span class='hs-comment'>-- The OneShotLambda functions simply fiddle with the IdInfo flag</span>
<a name="line-56"></a><span class='hs-comment'>-- But watch out: this may change the type of something else</span>
<a name="line-57"></a><span class='hs-comment'>--	f = \x -&gt; e</span>
<a name="line-58"></a><span class='hs-comment'>-- If we change the one-shot-ness of x, f's type changes</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="zapInfo"></a><span class='hs-definition'>zapInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>IdInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-2"></a><span class='hs-definition'>zapInfo</span> <span class='hs-varid'>zapper</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>maybeModifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>zapper</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="zapLamIdInfo"></a><span class='hs-definition'>zapLamIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-5"></a><span class='hs-definition'>zapLamIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zapInfo</span> <span class='hs-varid'>zapLamInfo</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="zapDemandIdInfo"></a><span class='hs-definition'>zapDemandIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-8"></a><span class='hs-definition'>zapDemandIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zapInfo</span> <span class='hs-varid'>zapDemandInfo</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="zapFragileIdInfo"></a><span class='hs-definition'>zapFragileIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-11"></a><span class='hs-definition'>zapFragileIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zapInfo</span> <span class='hs-varid'>zapFragileInfo</span> 
</pre>\end{code}

Note [transferPolyIdInfo]
~~~~~~~~~~~~~~~~~~~~~~~~~
Suppose we have

   f = /\a. let g = rhs in ...

where g has interesting strictness information.  Then if we float thus

   g' = /\a. rhs
   f = /\a. ...[g' a/g]

we *do not* want to lose g's
  * strictness information
  * arity 
  * inline pragma (though that is bit more debatable)

It's simple to retain strictness and arity, but not so simple to retain
  * worker info
  * rules
so we simply discard those.  Sooner or later this may bite us.

This transfer is used in two places: 
	FloatOut (long-distance let-floating)
	SimplUtils.abstractFloats (short-distance let-floating)

If we abstract wrt one or more *value* binders, we must modify the 
arity and strictness info before transferring it.  E.g. 
      f = \x. e
-->
      g' = \y. \x. e
      + substitute (g' y) for g
Notice that g' has an arity one more than the original g

\begin{code}
<pre><a name="line-1"></a><a name="transferPolyIdInfo"></a><span class='hs-definition'>transferPolyIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span>	<span class='hs-comment'>-- Original Id</span>
<a name="line-2"></a>		   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Var</span><span class='hs-keyglyph'>]</span>	<span class='hs-comment'>-- Abstract wrt these variables</span>
<a name="line-3"></a>		   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>	<span class='hs-comment'>-- New Id</span>
<a name="line-4"></a>		   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-5"></a><span class='hs-definition'>transferPolyIdInfo</span> <span class='hs-varid'>old_id</span> <span class='hs-varid'>abstract_wrt</span> <span class='hs-varid'>new_id</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-varid'>transfer</span> <span class='hs-varid'>new_id</span>
<a name="line-7"></a>  <span class='hs-keyword'>where</span>
<a name="line-8"></a>    <span class='hs-varid'>arity_increase</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>count</span> <span class='hs-varid'>isId</span> <span class='hs-varid'>abstract_wrt</span>	<span class='hs-comment'>-- Arity increases by the</span>
<a name="line-9"></a>    		     	   			<span class='hs-comment'>-- number of value binders</span>
<a name="line-10"></a>
<a name="line-11"></a>    <span class='hs-varid'>old_info</span> 	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idInfo</span> <span class='hs-varid'>old_id</span>
<a name="line-12"></a>    <span class='hs-varid'>old_arity</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>arityInfo</span> <span class='hs-varid'>old_info</span>
<a name="line-13"></a>    <span class='hs-varid'>old_inline_prag</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePragInfo</span> <span class='hs-varid'>old_info</span>
<a name="line-14"></a>    <span class='hs-varid'>new_arity</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>old_arity</span> <span class='hs-varop'>+</span> <span class='hs-varid'>arity_increase</span>
<a name="line-15"></a>    <span class='hs-varid'>old_strictness</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newStrictnessInfo</span> <span class='hs-varid'>old_info</span>
<a name="line-16"></a>    <span class='hs-varid'>new_strictness</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>increaseStrictSigArity</span> <span class='hs-varid'>arity_increase</span><span class='hs-layout'>)</span> <span class='hs-varid'>old_strictness</span>
<a name="line-17"></a>
<a name="line-18"></a>    <span class='hs-varid'>transfer</span> <span class='hs-varid'>new_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_info</span> <span class='hs-varop'>`setNewStrictnessInfo`</span> <span class='hs-varid'>new_strictness</span>
<a name="line-19"></a>			         <span class='hs-varop'>`setArityInfo`</span> <span class='hs-varid'>new_arity</span>
<a name="line-20"></a> 			         <span class='hs-varop'>`setInlinePragInfo`</span> <span class='hs-varid'>old_inline_prag</span>
</pre>\end{code}
</body>
</html>