Sophie

Sophie

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

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>rename/RnSource.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[RnSource]{Main pass of renamer}

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>RnSource</span> <span class='hs-layout'>(</span> 
<a name="line-2"></a>	<span class='hs-varid'>rnSrcDecls</span><span class='hs-layout'>,</span> <span class='hs-varid'>addTcgDUs</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnTyClDecls</span> 
<a name="line-3"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-4"></a>
<a name="line-5"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> <span class='hs-conid'>RnExpr</span><span class='hs-layout'>(</span> <span class='hs-varid'>rnLExpr</span> <span class='hs-layout'>)</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HsSyn</span>
<a name="line-10"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RdrName</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>,</span> <span class='hs-varid'>isRdrDataCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>elemLocalRdrEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>rdrNameOcc</span> <span class='hs-layout'>)</span>
<a name="line-11"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RdrHsSyn</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>extractGenericPatTyVars</span><span class='hs-layout'>,</span> <span class='hs-varid'>extractHsRhoRdrTyVars</span> <span class='hs-layout'>)</span>
<a name="line-12"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnHsSyn</span>
<a name="line-13"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnTypes</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>rnLHsType</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnLHsTypes</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnHsSigType</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnHsTypeFVs</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnContext</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnConDeclFields</span> <span class='hs-layout'>)</span>
<a name="line-14"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnBinds</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>rnTopBindsLHS</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnTopBindsRHS</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnMethodBinds</span><span class='hs-layout'>,</span> <span class='hs-varid'>renameSigs</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkSigTvFn</span><span class='hs-layout'>,</span>
<a name="line-15"></a>                                <span class='hs-varid'>makeMiniFixityEnv</span><span class='hs-layout'>)</span>
<a name="line-16"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnEnv</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>lookupLocalDataTcNames</span><span class='hs-layout'>,</span> <span class='hs-varid'>lookupLocatedOccRn</span><span class='hs-layout'>,</span>
<a name="line-17"></a>			  <span class='hs-varid'>lookupTopBndrRn</span><span class='hs-layout'>,</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span><span class='hs-layout'>,</span>
<a name="line-18"></a>			  <span class='hs-varid'>lookupOccRn</span><span class='hs-layout'>,</span> <span class='hs-varid'>newLocalBndrsRn</span><span class='hs-layout'>,</span> <span class='hs-varid'>bindLocalNamesFV</span><span class='hs-layout'>,</span>
<a name="line-19"></a>			  <span class='hs-varid'>bindLocatedLocalsFV</span><span class='hs-layout'>,</span> <span class='hs-varid'>bindPatSigTyVarsFV</span><span class='hs-layout'>,</span>
<a name="line-20"></a>			  <span class='hs-varid'>bindTyVarsRn</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendTyVarEnvFVRn</span><span class='hs-layout'>,</span>
<a name="line-21"></a>			  <span class='hs-varid'>bindLocalNames</span><span class='hs-layout'>,</span> <span class='hs-varid'>checkDupRdrNames</span><span class='hs-layout'>,</span> <span class='hs-varid'>mapFvRn</span>
<a name="line-22"></a>			<span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnNames</span>       	<span class='hs-layout'>(</span> <span class='hs-varid'>getLocalNonValBinders</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendGlobalRdrEnvRn</span> <span class='hs-layout'>)</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HscTypes</span>      	<span class='hs-layout'>(</span> <span class='hs-conid'>GenAvailInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>availsToNameSet</span> <span class='hs-layout'>)</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnHsDoc</span>          <span class='hs-layout'>(</span> <span class='hs-varid'>rnHsDoc</span><span class='hs-layout'>,</span> <span class='hs-varid'>rnMbLHsDoc</span> <span class='hs-layout'>)</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcRnMonad</span>
<a name="line-27"></a>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HscTypes</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>Warnings</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusWarns</span> <span class='hs-layout'>)</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>FunDep</span> <span class='hs-layout'>)</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-varid'>nameOccName</span> <span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameSet</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameEnv</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Bag</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>filterOut</span> <span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DynFlags</span>	        <span class='hs-layout'>(</span> <span class='hs-conid'>DynFlag</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>       <span class='hs-layout'>(</span> <span class='hs-conid'>Boxity</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ListSetOps</span>       <span class='hs-layout'>(</span> <span class='hs-varid'>findDupsEq</span> <span class='hs-layout'>)</span>
<a name="line-41"></a>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="thenM"></a><span class='hs-comment'>-- XXX</span>
<a name="line-2"></a><span class='hs-definition'>thenM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span>
<a name="line-3"></a><span class='hs-definition'>thenM</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;=</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="thenM_"></a><span class='hs-definition'>thenM_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span>
<a name="line-6"></a><span class='hs-definition'>thenM_</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;</span><span class='hs-layout'>)</span>
</pre>\end{code}

@rnSourceDecl@ `renames' declarations.
It simultaneously performs dependency analysis and precedence parsing.
It also does the following error checks:
\begin{enumerate}
\item
Checks that tyvars are used properly. This includes checking
for undefined tyvars, and tyvars in contexts that are ambiguous.
(Some of this checking has now been moved to module @TcMonoType@,
since we don't have functional dependency information at this point.)
\item
Checks that all variable occurences are defined.
\item 
Checks the @(..)@ etc constraints in the export list.
\end{enumerate}


\begin{code}
<pre><a name="line-1"></a><a name="rnSrcDecls"></a><span class='hs-comment'>-- Brings the binders of the group into scope in the appropriate places;</span>
<a name="line-2"></a><span class='hs-comment'>-- does NOT assume that anything is in scope already</span>
<a name="line-3"></a><span class='hs-definition'>rnSrcDecls</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsGroup</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>TcGblEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsGroup</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-4"></a><span class='hs-comment'>-- Rename a HsGroup; used for normal source files *and* hs-boot files</span>
<a name="line-5"></a><span class='hs-definition'>rnSrcDecls</span> <span class='hs-varid'>group</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>HsGroup</span> <span class='hs-layout'>{</span><span class='hs-varid'>hs_valds</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>val_decls</span><span class='hs-layout'>,</span>
<a name="line-6"></a>                                   <span class='hs-varid'>hs_tyclds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tycl_decls</span><span class='hs-layout'>,</span>
<a name="line-7"></a>                                   <span class='hs-varid'>hs_instds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inst_decls</span><span class='hs-layout'>,</span>
<a name="line-8"></a>                                   <span class='hs-varid'>hs_derivds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>deriv_decls</span><span class='hs-layout'>,</span>
<a name="line-9"></a>                                   <span class='hs-varid'>hs_fixds</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fix_decls</span><span class='hs-layout'>,</span>
<a name="line-10"></a>                                   <span class='hs-varid'>hs_warnds</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>warn_decls</span><span class='hs-layout'>,</span>
<a name="line-11"></a>                                   <span class='hs-varid'>hs_annds</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ann_decls</span><span class='hs-layout'>,</span>
<a name="line-12"></a>                                   <span class='hs-varid'>hs_fords</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foreign_decls</span><span class='hs-layout'>,</span>
<a name="line-13"></a>                                   <span class='hs-varid'>hs_defds</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>default_decls</span><span class='hs-layout'>,</span>
<a name="line-14"></a>                                   <span class='hs-varid'>hs_ruleds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rule_decls</span><span class='hs-layout'>,</span>
<a name="line-15"></a>                                   <span class='hs-varid'>hs_docs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>docs</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-16"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>
<a name="line-17"></a>   <span class='hs-comment'>-- (A) Process the fixity declarations, creating a mapping from</span>
<a name="line-18"></a>   <span class='hs-comment'>--     FastStrings to FixItems.</span>
<a name="line-19"></a>   <span class='hs-comment'>--     Also checks for duplcates.</span>
<a name="line-20"></a>   <span class='hs-varid'>local_fix_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>makeMiniFixityEnv</span> <span class='hs-varid'>fix_decls</span><span class='hs-layout'>;</span>
<a name="line-21"></a>
<a name="line-22"></a>   <span class='hs-comment'>-- (B) Bring top level binders (and their fixities) into scope,</span>
<a name="line-23"></a>   <span class='hs-comment'>--     *except* for the value bindings, which get brought in below.</span>
<a name="line-24"></a>   <span class='hs-comment'>--     However *do* include class ops, data constructors</span>
<a name="line-25"></a>   <span class='hs-comment'>--     And for hs-boot files *do* include the value signatures</span>
<a name="line-26"></a>   <span class='hs-varid'>tc_avails</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLocalNonValBinders</span> <span class='hs-varid'>group</span> <span class='hs-layout'>;</span>
<a name="line-27"></a>   <span class='hs-varid'>tc_envs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>extendGlobalRdrEnvRn</span> <span class='hs-varid'>tc_avails</span> <span class='hs-varid'>local_fix_env</span> <span class='hs-layout'>;</span>
<a name="line-28"></a>   <span class='hs-varid'>setEnvs</span> <span class='hs-varid'>tc_envs</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>
<a name="line-29"></a>
<a name="line-30"></a>   <span class='hs-varid'>failIfErrsM</span> <span class='hs-layout'>;</span> <span class='hs-comment'>-- No point in continuing if (say) we have duplicate declarations</span>
<a name="line-31"></a>
<a name="line-32"></a>   <span class='hs-comment'>-- (C) Extract the mapping from data constructors to field names and</span>
<a name="line-33"></a>   <span class='hs-comment'>--     extend the record field env.</span>
<a name="line-34"></a>   <span class='hs-comment'>--     This depends on the data constructors and field names being in</span>
<a name="line-35"></a>   <span class='hs-comment'>--     scope from (B) above</span>
<a name="line-36"></a>   <span class='hs-varid'>inNewEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>extendRecordFieldEnv</span> <span class='hs-varid'>tycl_decls</span> <span class='hs-varid'>inst_decls</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>
<a name="line-37"></a>
<a name="line-38"></a>   <span class='hs-comment'>-- (D) Rename the left-hand sides of the value bindings.</span>
<a name="line-39"></a>   <span class='hs-comment'>--     This depends on everything from (B) being in scope,</span>
<a name="line-40"></a>   <span class='hs-comment'>--     and on (C) for resolving record wild cards.</span>
<a name="line-41"></a>   <span class='hs-comment'>--     It uses the fixity env from (A) to bind fixities for view patterns.</span>
<a name="line-42"></a>   <span class='hs-varid'>new_lhs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnTopBindsLHS</span> <span class='hs-varid'>local_fix_env</span> <span class='hs-varid'>val_decls</span> <span class='hs-layout'>;</span>
<a name="line-43"></a>   <span class='hs-comment'>-- bind the LHSes (and their fixities) in the global rdr environment</span>
<a name="line-44"></a>   <span class='hs-keyword'>let</span> <span class='hs-layout'>{</span> <span class='hs-varid'>val_binders</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>unLoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>collectHsValBinders</span> <span class='hs-varid'>new_lhs</span> <span class='hs-layout'>;</span>
<a name="line-45"></a>	 <span class='hs-varid'>val_bndr_set</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNameSet</span> <span class='hs-varid'>val_binders</span> <span class='hs-layout'>;</span>
<a name="line-46"></a>	 <span class='hs-varid'>all_bndr_set</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>val_bndr_set</span> <span class='hs-varop'>`unionNameSets`</span> <span class='hs-varid'>availsToNameSet</span> <span class='hs-varid'>tc_avails</span> <span class='hs-layout'>;</span>
<a name="line-47"></a>         <span class='hs-varid'>val_avails</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-conid'>Avail</span> <span class='hs-varid'>val_binders</span> 
<a name="line-48"></a>       <span class='hs-layout'>}</span> <span class='hs-layout'>;</span>
<a name="line-49"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>tcg_env</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcl_env</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>extendGlobalRdrEnvRn</span> <span class='hs-varid'>val_avails</span> <span class='hs-varid'>local_fix_env</span> <span class='hs-layout'>;</span>
<a name="line-50"></a>   <span class='hs-varid'>setEnvs</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcg_env</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcl_env</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>
<a name="line-51"></a>
<a name="line-52"></a>   <span class='hs-comment'>--  Now everything is in scope, as the remaining renaming assumes.</span>
<a name="line-53"></a>
<a name="line-54"></a>   <span class='hs-comment'>-- (E) Rename type and class decls</span>
<a name="line-55"></a>   <span class='hs-comment'>--     (note that value LHSes need to be in scope for default methods)</span>
<a name="line-56"></a>   <span class='hs-comment'>--</span>
<a name="line-57"></a>   <span class='hs-comment'>-- You might think that we could build proper def/use information</span>
<a name="line-58"></a>   <span class='hs-comment'>-- for type and class declarations, but they can be involved</span>
<a name="line-59"></a>   <span class='hs-comment'>-- in mutual recursion across modules, and we only do the SCC</span>
<a name="line-60"></a>   <span class='hs-comment'>-- analysis for them in the type checker.</span>
<a name="line-61"></a>   <span class='hs-comment'>-- So we content ourselves with gathering uses only; that</span>
<a name="line-62"></a>   <span class='hs-comment'>-- means we'll only report a declaration as unused if it isn't</span>
<a name="line-63"></a>   <span class='hs-comment'>-- mentioned at all.  Ah well.</span>
<a name="line-64"></a>   <span class='hs-varid'>traceRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Start rnTyClDecls"</span><span class='hs-layout'>)</span> <span class='hs-layout'>;</span>
<a name="line-65"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>rn_tycl_decls</span><span class='hs-layout'>,</span> <span class='hs-varid'>src_fvs1</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnTyClDecl</span> <span class='hs-varid'>tycl_decls</span> <span class='hs-layout'>;</span>
<a name="line-66"></a>
<a name="line-67"></a>   <span class='hs-comment'>-- (F) Rename Value declarations right-hand sides</span>
<a name="line-68"></a>   <span class='hs-varid'>traceRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Start rnmono"</span><span class='hs-layout'>)</span> <span class='hs-layout'>;</span>
<a name="line-69"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>rn_val_decls</span><span class='hs-layout'>,</span> <span class='hs-varid'>bind_dus</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnTopBindsRHS</span> <span class='hs-varid'>val_bndr_set</span> <span class='hs-varid'>new_lhs</span> <span class='hs-layout'>;</span>
<a name="line-70"></a>   <span class='hs-varid'>traceRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"finish rnmono"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>rn_val_decls</span><span class='hs-layout'>)</span> <span class='hs-layout'>;</span>
<a name="line-71"></a>
<a name="line-72"></a>   <span class='hs-comment'>-- (G) Rename Fixity and deprecations</span>
<a name="line-73"></a>   
<a name="line-74"></a>   <span class='hs-comment'>-- Rename fixity declarations and error if we try to</span>
<a name="line-75"></a>   <span class='hs-comment'>-- fix something from another module (duplicates were checked in (A))</span>
<a name="line-76"></a>   <span class='hs-varid'>rn_fix_decls</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnSrcFixityDecls</span> <span class='hs-varid'>all_bndr_set</span> <span class='hs-varid'>fix_decls</span> <span class='hs-layout'>;</span>
<a name="line-77"></a>
<a name="line-78"></a>   <span class='hs-comment'>-- Rename deprec decls;</span>
<a name="line-79"></a>   <span class='hs-comment'>-- check for duplicates and ensure that deprecated things are defined locally</span>
<a name="line-80"></a>   <span class='hs-comment'>-- at the moment, we don't keep these around past renaming</span>
<a name="line-81"></a>   <span class='hs-varid'>rn_warns</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnSrcWarnDecls</span> <span class='hs-varid'>all_bndr_set</span> <span class='hs-varid'>warn_decls</span> <span class='hs-layout'>;</span>
<a name="line-82"></a>
<a name="line-83"></a>   <span class='hs-comment'>-- (H) Rename Everything else</span>
<a name="line-84"></a>
<a name="line-85"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>rn_inst_decls</span><span class='hs-layout'>,</span>    <span class='hs-varid'>src_fvs2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnSrcInstDecl</span>   <span class='hs-varid'>inst_decls</span> <span class='hs-layout'>;</span>
<a name="line-86"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>rn_rule_decls</span><span class='hs-layout'>,</span>    <span class='hs-varid'>src_fvs3</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>setOptM</span> <span class='hs-conid'>Opt_ScopedTypeVariables</span> <span class='hs-varop'>$</span>
<a name="line-87"></a>   		      		   <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnHsRuleDecl</span>    <span class='hs-varid'>rule_decls</span> <span class='hs-layout'>;</span>
<a name="line-88"></a>			   <span class='hs-comment'>-- Inside RULES, scoped type variables are on</span>
<a name="line-89"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>rn_foreign_decls</span><span class='hs-layout'>,</span> <span class='hs-varid'>src_fvs4</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnHsForeignDecl</span> <span class='hs-varid'>foreign_decls</span> <span class='hs-layout'>;</span>
<a name="line-90"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>rn_ann_decls</span><span class='hs-layout'>,</span>     <span class='hs-varid'>src_fvs5</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnAnnDecl</span>       <span class='hs-varid'>ann_decls</span> <span class='hs-layout'>;</span>
<a name="line-91"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>rn_default_decls</span><span class='hs-layout'>,</span> <span class='hs-varid'>src_fvs6</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnDefaultDecl</span>   <span class='hs-varid'>default_decls</span> <span class='hs-layout'>;</span>
<a name="line-92"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>rn_deriv_decls</span><span class='hs-layout'>,</span>   <span class='hs-varid'>src_fvs7</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnSrcDerivDecl</span>  <span class='hs-varid'>deriv_decls</span> <span class='hs-layout'>;</span>
<a name="line-93"></a>      <span class='hs-comment'>-- Haddock docs; no free vars</span>
<a name="line-94"></a>   <span class='hs-varid'>rn_docs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrapLocM</span> <span class='hs-varid'>rnDocDecl</span><span class='hs-layout'>)</span> <span class='hs-varid'>docs</span> <span class='hs-layout'>;</span>
<a name="line-95"></a>
<a name="line-96"></a>   <span class='hs-comment'>-- (I) Compute the results and return</span>
<a name="line-97"></a>   <span class='hs-keyword'>let</span> <span class='hs-layout'>{</span><span class='hs-varid'>rn_group</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HsGroup</span> <span class='hs-layout'>{</span> <span class='hs-varid'>hs_valds</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_val_decls</span><span class='hs-layout'>,</span>
<a name="line-98"></a>			     <span class='hs-varid'>hs_tyclds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_tycl_decls</span><span class='hs-layout'>,</span>
<a name="line-99"></a>			     <span class='hs-varid'>hs_instds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_inst_decls</span><span class='hs-layout'>,</span>
<a name="line-100"></a>                             <span class='hs-varid'>hs_derivds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_deriv_decls</span><span class='hs-layout'>,</span>
<a name="line-101"></a>			     <span class='hs-varid'>hs_fixds</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_fix_decls</span><span class='hs-layout'>,</span>
<a name="line-102"></a>			     <span class='hs-varid'>hs_warnds</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- warns are returned in the tcg_env</span>
<a name="line-103"></a>	                                     <span class='hs-comment'>-- (see below) not in the HsGroup</span>
<a name="line-104"></a>			     <span class='hs-varid'>hs_fords</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_foreign_decls</span><span class='hs-layout'>,</span>
<a name="line-105"></a>			     <span class='hs-varid'>hs_annds</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_ann_decls</span><span class='hs-layout'>,</span>
<a name="line-106"></a>			     <span class='hs-varid'>hs_defds</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_default_decls</span><span class='hs-layout'>,</span>
<a name="line-107"></a>			     <span class='hs-varid'>hs_ruleds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_rule_decls</span><span class='hs-layout'>,</span>
<a name="line-108"></a>                             <span class='hs-varid'>hs_docs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rn_docs</span> <span class='hs-layout'>}</span> <span class='hs-layout'>;</span>
<a name="line-109"></a>
<a name="line-110"></a>	<span class='hs-varid'>other_fvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>plusFVs</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>src_fvs1</span><span class='hs-layout'>,</span> <span class='hs-varid'>src_fvs2</span><span class='hs-layout'>,</span> <span class='hs-varid'>src_fvs3</span><span class='hs-layout'>,</span> <span class='hs-varid'>src_fvs4</span><span class='hs-layout'>,</span> 
<a name="line-111"></a>			     <span class='hs-varid'>src_fvs5</span><span class='hs-layout'>,</span> <span class='hs-varid'>src_fvs6</span><span class='hs-layout'>,</span> <span class='hs-varid'>src_fvs7</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>;</span>
<a name="line-112"></a>	<span class='hs-varid'>src_dus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bind_dus</span> <span class='hs-varop'>`plusDU`</span> <span class='hs-varid'>usesOnly</span> <span class='hs-varid'>other_fvs</span><span class='hs-layout'>;</span>
<a name="line-113"></a>		<span class='hs-comment'>-- Note: src_dus will contain *uses* for locally-defined types</span>
<a name="line-114"></a>		<span class='hs-comment'>-- and classes, but no *defs* for them.  (Because rnTyClDecl </span>
<a name="line-115"></a>		<span class='hs-comment'>-- returns only the uses.)  This is a little </span>
<a name="line-116"></a>		<span class='hs-comment'>-- surprising but it doesn't actually matter at all.</span>
<a name="line-117"></a>
<a name="line-118"></a>       <span class='hs-varid'>final_tcg_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>tcg_env'</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcg_env</span> <span class='hs-varop'>`addTcgDUs`</span> <span class='hs-varid'>src_dus</span><span class='hs-layout'>)</span>
<a name="line-119"></a>                       <span class='hs-keyword'>in</span> <span class='hs-comment'>-- we return the deprecs in the env, not in the HsGroup above</span>
<a name="line-120"></a>                         <span class='hs-varid'>tcg_env'</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tcg_warns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcg_warns</span> <span class='hs-varid'>tcg_env'</span> <span class='hs-varop'>`plusWarns`</span> <span class='hs-varid'>rn_warns</span> <span class='hs-layout'>}</span><span class='hs-layout'>;</span>
<a name="line-121"></a>       <span class='hs-layout'>}</span> <span class='hs-layout'>;</span>
<a name="line-122"></a>
<a name="line-123"></a>   <span class='hs-varid'>traceRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"finish rnSrc"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>rn_group</span><span class='hs-layout'>)</span> <span class='hs-layout'>;</span>
<a name="line-124"></a>   <span class='hs-varid'>traceRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"finish Dus"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>src_dus</span> <span class='hs-layout'>)</span> <span class='hs-layout'>;</span>
<a name="line-125"></a>   <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>final_tcg_env</span> <span class='hs-layout'>,</span> <span class='hs-varid'>rn_group</span><span class='hs-layout'>)</span>
<a name="line-126"></a>                    <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-127"></a>
<a name="line-128"></a><a name="inNewEnv"></a><span class='hs-comment'>-- some utils because we do this a bunch above</span>
<a name="line-129"></a><span class='hs-comment'>-- compute and install the new env</span>
<a name="line-130"></a><span class='hs-definition'>inNewEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TcGblEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TcGblEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span>
<a name="line-131"></a><span class='hs-definition'>inNewEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>cont</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>env</span>
<a name="line-132"></a>                       <span class='hs-varid'>setGblEnv</span> <span class='hs-varid'>e</span> <span class='hs-varop'>$</span> <span class='hs-varid'>cont</span> <span class='hs-varid'>e</span>
<a name="line-133"></a>
<a name="line-134"></a><a name="rnTyClDecls"></a><span class='hs-definition'>rnTyClDecls</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LTyClDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LTyClDecl</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-135"></a><span class='hs-comment'>-- Used for external core</span>
<a name="line-136"></a><span class='hs-definition'>rnTyClDecls</span> <span class='hs-varid'>tycl_decls</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>  <span class='hs-layout'>(</span><span class='hs-varid'>decls'</span><span class='hs-layout'>,</span> <span class='hs-sel'>_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnTyClDecl</span> <span class='hs-varid'>tycl_decls</span>
<a name="line-137"></a>			     <span class='hs-varid'>return</span> <span class='hs-varid'>decls'</span>
<a name="line-138"></a>
<a name="line-139"></a><a name="addTcgDUs"></a><span class='hs-definition'>addTcgDUs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcGblEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DefUses</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcGblEnv</span> 
<a name="line-140"></a><span class='hs-comment'>-- This function could be defined lower down in the module hierarchy, </span>
<a name="line-141"></a><span class='hs-comment'>-- but there doesn't seem anywhere very logical to put it.</span>
<a name="line-142"></a><span class='hs-definition'>addTcgDUs</span> <span class='hs-varid'>tcg_env</span> <span class='hs-varid'>dus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcg_env</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tcg_dus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcg_dus</span> <span class='hs-varid'>tcg_env</span> <span class='hs-varop'>`plusDU`</span> <span class='hs-varid'>dus</span> <span class='hs-layout'>}</span>
<a name="line-143"></a>
<a name="line-144"></a><a name="rnList"></a><span class='hs-definition'>rnList</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Located</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Located</span> <span class='hs-varid'>b</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-145"></a><span class='hs-definition'>rnList</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapFvRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrapLocFstM</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span>
</pre>\end{code}


%*********************************************************
%*						 	 *
	HsDoc stuff
%*							 *
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnDocDecl"></a><span class='hs-definition'>rnDocDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DocDecl</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-conid'>DocDecl</span>
<a name="line-2"></a><span class='hs-definition'>rnDocDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>DocCommentNext</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 
<a name="line-3"></a>  <span class='hs-varid'>rn_doc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnHsDoc</span> <span class='hs-varid'>doc</span>
<a name="line-4"></a>  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DocCommentNext</span> <span class='hs-varid'>rn_doc</span><span class='hs-layout'>)</span>
<a name="line-5"></a><span class='hs-definition'>rnDocDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>DocCommentPrev</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 
<a name="line-6"></a>  <span class='hs-varid'>rn_doc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnHsDoc</span> <span class='hs-varid'>doc</span>
<a name="line-7"></a>  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DocCommentPrev</span> <span class='hs-varid'>rn_doc</span><span class='hs-layout'>)</span>
<a name="line-8"></a><span class='hs-definition'>rnDocDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>DocCommentNamed</span> <span class='hs-varid'>str</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-9"></a>  <span class='hs-varid'>rn_doc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnHsDoc</span> <span class='hs-varid'>doc</span>
<a name="line-10"></a>  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DocCommentNamed</span> <span class='hs-varid'>str</span> <span class='hs-varid'>rn_doc</span><span class='hs-layout'>)</span>
<a name="line-11"></a><span class='hs-definition'>rnDocDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>DocGroup</span> <span class='hs-varid'>lev</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-12"></a>  <span class='hs-varid'>rn_doc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnHsDoc</span> <span class='hs-varid'>doc</span>
<a name="line-13"></a>  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DocGroup</span> <span class='hs-varid'>lev</span> <span class='hs-varid'>rn_doc</span><span class='hs-layout'>)</span>
</pre>\end{code}


%*********************************************************
%*						 	 *
	Source-code fixity declarations
%*							 *
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnSrcFixityDecls"></a><span class='hs-definition'>rnSrcFixityDecls</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LFixitySig</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LFixitySig</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-2"></a><span class='hs-comment'>-- Rename the fixity decls, so we can put</span>
<a name="line-3"></a><span class='hs-comment'>-- the renamed decls in the renamed syntax tree</span>
<a name="line-4"></a><span class='hs-comment'>-- Errors if the thing being fixed is not defined locally.</span>
<a name="line-5"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><span class='hs-comment'>-- The returned FixitySigs are not actually used for anything,</span>
<a name="line-7"></a><span class='hs-comment'>-- except perhaps the GHCi API</span>
<a name="line-8"></a><span class='hs-definition'>rnSrcFixityDecls</span> <span class='hs-varid'>bound_names</span> <span class='hs-varid'>fix_decls</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>fix_decls</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>rn_decl</span> <span class='hs-varid'>fix_decls</span>
<a name="line-10"></a>       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>concat</span> <span class='hs-varid'>fix_decls</span><span class='hs-layout'>)</span>
<a name="line-11"></a>  <span class='hs-keyword'>where</span>
<a name="line-12"></a>    <span class='hs-varid'>rn_decl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LFixitySig</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LFixitySig</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-13"></a>        <span class='hs-comment'>-- GHC extension: look up both the tycon and data con </span>
<a name="line-14"></a>	<span class='hs-comment'>-- for con-like things; hence returning a list</span>
<a name="line-15"></a>	<span class='hs-comment'>-- If neither are in scope, report an error; otherwise</span>
<a name="line-16"></a>	<span class='hs-comment'>-- return a fixity sig for each (slightly odd)</span>
<a name="line-17"></a>    <span class='hs-varid'>rn_decl</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-conid'>FixitySig</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>name_loc</span> <span class='hs-varid'>rdr_name</span><span class='hs-layout'>)</span> <span class='hs-varid'>fixity</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-18"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>name_loc</span> <span class='hs-varop'>$</span>
<a name="line-19"></a>                    <span class='hs-comment'>-- this lookup will fail if the definition isn't local</span>
<a name="line-20"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>names</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupLocalDataTcNames</span> <span class='hs-varid'>bound_names</span> <span class='hs-varid'>what</span> <span class='hs-varid'>rdr_name</span>
<a name="line-21"></a>           <span class='hs-varid'>return</span> <span class='hs-keyglyph'>[</span> <span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-conid'>FixitySig</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>name_loc</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varid'>fixity</span><span class='hs-layout'>)</span>
<a name="line-22"></a>                  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>names</span> <span class='hs-keyglyph'>]</span>
<a name="line-23"></a>    <span class='hs-varid'>what</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"fixity signature"</span><span class='hs-layout'>)</span>
</pre>\end{code}


%*********************************************************
%*						 	 *
	Source-code deprecations declarations
%*							 *
%*********************************************************

Check that the deprecated names are defined, are defined locally, and
that there are no duplicate deprecations.

It's only imported deprecations, dealt with in RnIfaces, that we
gather them together.

\begin{code}
<pre><a name="line-1"></a><a name="rnSrcWarnDecls"></a><span class='hs-comment'>-- checks that the deprecations are defined locally, and that there are no duplicates</span>
<a name="line-2"></a><span class='hs-definition'>rnSrcWarnDecls</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LWarnDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-conid'>Warnings</span>
<a name="line-3"></a><span class='hs-definition'>rnSrcWarnDecls</span> <span class='hs-sel'>_bound_names</span> <span class='hs-conid'>[]</span> 
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>NoWarnings</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-definition'>rnSrcWarnDecls</span> <span class='hs-varid'>bound_names</span> <span class='hs-varid'>decls</span> 
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-comment'>-- check for duplicates</span>
<a name="line-8"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>rdr</span><span class='hs-conop'>:</span><span class='hs-varid'>lrdr'</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>addErrAt</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-varid'>dupWarnDecl</span> <span class='hs-varid'>lrdr'</span> <span class='hs-varid'>rdr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
<a name="line-9"></a>               <span class='hs-varid'>warn_rdr_dups</span>
<a name="line-10"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>pairs_s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>addLocM</span> <span class='hs-varid'>rn_deprec</span><span class='hs-layout'>)</span> <span class='hs-varid'>decls</span>
<a name="line-11"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>WarnSome</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>concat</span> <span class='hs-varid'>pairs_s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-12"></a> <span class='hs-keyword'>where</span>
<a name="line-13"></a>   <span class='hs-varid'>rn_deprec</span> <span class='hs-layout'>(</span><span class='hs-conid'>Warning</span> <span class='hs-varid'>rdr_name</span> <span class='hs-varid'>txt</span><span class='hs-layout'>)</span>
<a name="line-14"></a>       <span class='hs-comment'>-- ensures that the names are defined locally</span>
<a name="line-15"></a>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupLocalDataTcNames</span> <span class='hs-varid'>bound_names</span> <span class='hs-varid'>what</span> <span class='hs-varid'>rdr_name</span>	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>names</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-16"></a>       <span class='hs-varid'>return</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>txt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>names</span><span class='hs-keyglyph'>]</span>
<a name="line-17"></a>   
<a name="line-18"></a>   <span class='hs-varid'>what</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"deprecation"</span><span class='hs-layout'>)</span>
<a name="line-19"></a>
<a name="line-20"></a>   <span class='hs-comment'>-- look for duplicates among the OccNames;</span>
<a name="line-21"></a>   <span class='hs-comment'>-- we check that the names are defined above</span>
<a name="line-22"></a>   <span class='hs-comment'>-- invt: the lists returned by findDupsEq always have at least two elements</span>
<a name="line-23"></a>   <span class='hs-varid'>warn_rdr_dups</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findDupsEq</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>rdrNameOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-varid'>rdrNameOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-24"></a>                     <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-conid'>Warning</span> <span class='hs-varid'>rdr_name</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>rdr_name</span><span class='hs-layout'>)</span> <span class='hs-varid'>decls</span><span class='hs-layout'>)</span>
<a name="line-25"></a>               
<a name="line-26"></a><a name="dupWarnDecl"></a><span class='hs-definition'>dupWarnDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Located</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-27"></a><span class='hs-comment'>-- Located RdrName -&gt; DeprecDecl RdrName -&gt; SDoc</span>
<a name="line-28"></a><span class='hs-definition'>dupWarnDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>rdr_name</span>
<a name="line-29"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Multiple warning declarations for"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>rdr_name</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-30"></a>          <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"also at "</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>loc</span><span class='hs-keyglyph'>]</span>
<a name="line-31"></a>
</pre>\end{code}

%*********************************************************
%*							*
\subsection{Annotation declarations}
%*							*
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnAnnDecl"></a><span class='hs-definition'>rnAnnDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AnnDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnnDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>rnAnnDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsAnnotation</span> <span class='hs-varid'>provenance</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-3"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>provenance'</span><span class='hs-layout'>,</span> <span class='hs-varid'>provenance_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnAnnProvenance</span> <span class='hs-varid'>provenance</span>
<a name="line-4"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>expr'</span><span class='hs-layout'>,</span> <span class='hs-varid'>expr_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnLExpr</span> <span class='hs-varid'>expr</span>
<a name="line-5"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsAnnotation</span> <span class='hs-varid'>provenance'</span> <span class='hs-varid'>expr'</span><span class='hs-layout'>,</span> <span class='hs-varid'>provenance_fvs</span> <span class='hs-varop'>`plusFV`</span> <span class='hs-varid'>expr_fvs</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="rnAnnProvenance"></a><span class='hs-definition'>rnAnnProvenance</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AnnProvenance</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnnProvenance</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-8"></a><span class='hs-definition'>rnAnnProvenance</span> <span class='hs-varid'>provenance</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-9"></a>    <span class='hs-varid'>provenance'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>modifyAnnProvenanceNameM</span> <span class='hs-varid'>lookupTopBndrRn</span> <span class='hs-varid'>provenance</span>
<a name="line-10"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>provenance'</span><span class='hs-layout'>,</span> <span class='hs-varid'>maybe</span> <span class='hs-varid'>emptyFVs</span> <span class='hs-varid'>unitFV</span> <span class='hs-layout'>(</span><span class='hs-varid'>annProvenanceName_maybe</span> <span class='hs-varid'>provenance'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}

%*********************************************************
%*							*
\subsection{Default declarations}
%*							*
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnDefaultDecl"></a><span class='hs-definition'>rnDefaultDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DefaultDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>DefaultDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>rnDefaultDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>DefaultDecl</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapFvRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>rnHsTypeFVs</span> <span class='hs-varid'>doc_str</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys</span>	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>tys'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-4"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DefaultDecl</span> <span class='hs-varid'>tys'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span>
<a name="line-5"></a>  <span class='hs-keyword'>where</span>
<a name="line-6"></a>    <span class='hs-varid'>doc_str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"In a `default' declaration"</span>
</pre>\end{code}

%*********************************************************
%*							*
\subsection{Foreign declarations}
%*							*
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnHsForeignDecl"></a><span class='hs-definition'>rnHsForeignDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ForeignDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>rnHsForeignDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignImport</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>spec</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span> <span class='hs-varid'>name</span>	        <span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>name'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-4"></a>    <span class='hs-varid'>rnHsTypeFVs</span> <span class='hs-layout'>(</span><span class='hs-varid'>fo_decl_msg</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-5"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignImport</span> <span class='hs-varid'>name'</span> <span class='hs-varid'>ty'</span> <span class='hs-varid'>spec</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-definition'>rnHsForeignDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignExport</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>spec</span><span class='hs-layout'>)</span>
<a name="line-8"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupLocatedOccRn</span> <span class='hs-varid'>name</span>	        <span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>name'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-9"></a>    <span class='hs-varid'>rnHsTypeFVs</span> <span class='hs-layout'>(</span><span class='hs-varid'>fo_decl_msg</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>  	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-10"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignExport</span> <span class='hs-varid'>name'</span> <span class='hs-varid'>ty'</span> <span class='hs-varid'>spec</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span> <span class='hs-varop'>`addOneFV`</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>name'</span><span class='hs-layout'>)</span>
<a name="line-11"></a>	<span class='hs-comment'>-- NB: a foreign export is an *occurrence site* for name, so </span>
<a name="line-12"></a>	<span class='hs-comment'>--     we add it to the free-variable list.  It might, for example,</span>
<a name="line-13"></a>	<span class='hs-comment'>--     be imported from another module</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="fo_decl_msg"></a><span class='hs-definition'>fo_decl_msg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Located</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-16"></a><span class='hs-definition'>fo_decl_msg</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"In the foreign declaration for"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span>
</pre>\end{code}


%*********************************************************
%*							*
\subsection{Instance declarations}
%*							*
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnSrcInstDecl"></a><span class='hs-definition'>rnSrcInstDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>rnSrcInstDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstDecl</span> <span class='hs-varid'>inst_ty</span> <span class='hs-varid'>mbinds</span> <span class='hs-varid'>uprags</span> <span class='hs-varid'>ats</span><span class='hs-layout'>)</span>
<a name="line-3"></a>	<span class='hs-comment'>-- Used for both source and interface file decls</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnHsSigType</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"an instance decl"</span><span class='hs-layout'>)</span> <span class='hs-varid'>inst_ty</span>	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>inst_ty'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-5"></a>
<a name="line-6"></a>	<span class='hs-comment'>-- Rename the bindings</span>
<a name="line-7"></a>	<span class='hs-comment'>-- The typechecker (not the renamer) checks that all </span>
<a name="line-8"></a>	<span class='hs-comment'>-- the bindings are for the right class</span>
<a name="line-9"></a>    <span class='hs-keyword'>let</span>
<a name="line-10"></a>	<span class='hs-varid'>meth_names</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>collectHsBindLocatedBinders</span> <span class='hs-varid'>mbinds</span>
<a name="line-11"></a>	<span class='hs-layout'>(</span><span class='hs-varid'>inst_tyvars</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>cls</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitHsInstDeclTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>inst_ty'</span><span class='hs-layout'>)</span>
<a name="line-12"></a>    <span class='hs-keyword'>in</span>
<a name="line-13"></a>    <span class='hs-varid'>checkDupRdrNames</span> <span class='hs-varid'>meth_names</span> 	<span class='hs-varop'>`thenM_`</span>
<a name="line-14"></a>	<span class='hs-comment'>-- Check that the same method is not given twice in the</span>
<a name="line-15"></a>	<span class='hs-comment'>-- same instance decl	instance C T where</span>
<a name="line-16"></a>	<span class='hs-comment'>--			      f x = ...</span>
<a name="line-17"></a>	<span class='hs-comment'>--			      g y = ...</span>
<a name="line-18"></a>	<span class='hs-comment'>--			      f x = ...</span>
<a name="line-19"></a>	<span class='hs-comment'>-- We must use checkDupRdrNames because the Name of the</span>
<a name="line-20"></a>	<span class='hs-comment'>-- method is the Name of the class selector, whose SrcSpan</span>
<a name="line-21"></a>	<span class='hs-comment'>-- points to the class declaration</span>
<a name="line-22"></a>
<a name="line-23"></a>    <span class='hs-varid'>extendTyVarEnvForMethodBinds</span> <span class='hs-varid'>inst_tyvars</span> <span class='hs-layout'>(</span>		
<a name="line-24"></a>	<span class='hs-comment'>-- (Slightly strangely) the forall-d tyvars scope over</span>
<a name="line-25"></a>	<span class='hs-comment'>-- the method bindings too</span>
<a name="line-26"></a>	<span class='hs-varid'>rnMethodBinds</span> <span class='hs-varid'>cls</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> 	<span class='hs-comment'>-- No scoped tyvars</span>
<a name="line-27"></a>		      <span class='hs-conid'>[]</span> <span class='hs-varid'>mbinds</span>
<a name="line-28"></a>    <span class='hs-layout'>)</span>						<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>mbinds'</span><span class='hs-layout'>,</span> <span class='hs-varid'>meth_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-29"></a>	<span class='hs-comment'>-- Rename the associated types</span>
<a name="line-30"></a>	<span class='hs-comment'>-- The typechecker (not the renamer) checks that all </span>
<a name="line-31"></a>	<span class='hs-comment'>-- the declarations are for the right class</span>
<a name="line-32"></a>    <span class='hs-keyword'>let</span>
<a name="line-33"></a>	<span class='hs-varid'>at_names</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tyClDeclNames</span> <span class='hs-varop'>.</span> <span class='hs-varid'>unLoc</span><span class='hs-layout'>)</span> <span class='hs-varid'>ats</span>
<a name="line-34"></a>    <span class='hs-keyword'>in</span>
<a name="line-35"></a>    <span class='hs-varid'>checkDupRdrNames</span> <span class='hs-varid'>at_names</span>		<span class='hs-varop'>`thenM_`</span>
<a name="line-36"></a>	<span class='hs-comment'>-- See notes with checkDupRdrNames for methods, above</span>
<a name="line-37"></a>
<a name="line-38"></a>    <span class='hs-varid'>rnATInsts</span> <span class='hs-varid'>ats</span>				<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>ats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>at_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-39"></a>
<a name="line-40"></a>	<span class='hs-comment'>-- Rename the prags and signatures.</span>
<a name="line-41"></a>	<span class='hs-comment'>-- Note that the type variables are not in scope here,</span>
<a name="line-42"></a>	<span class='hs-comment'>-- so that	instance Eq a =&gt; Eq (T a) where</span>
<a name="line-43"></a>	<span class='hs-comment'>--			{-# SPECIALISE instance Eq a =&gt; Eq (T [a]) #-}</span>
<a name="line-44"></a>	<span class='hs-comment'>-- works OK. </span>
<a name="line-45"></a>	<span class='hs-comment'>--</span>
<a name="line-46"></a>	<span class='hs-comment'>-- But the (unqualified) method names are in scope</span>
<a name="line-47"></a>    <span class='hs-keyword'>let</span> 
<a name="line-48"></a>	<span class='hs-varid'>binders</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>collectHsBindBinders</span> <span class='hs-varid'>mbinds'</span>
<a name="line-49"></a>	<span class='hs-varid'>bndr_set</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNameSet</span> <span class='hs-varid'>binders</span>
<a name="line-50"></a>    <span class='hs-keyword'>in</span>
<a name="line-51"></a>    <span class='hs-varid'>bindLocalNames</span> <span class='hs-varid'>binders</span> 
<a name="line-52"></a>	<span class='hs-layout'>(</span><span class='hs-varid'>renameSigs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>bndr_set</span><span class='hs-layout'>)</span> <span class='hs-varid'>okInstDclSig</span> <span class='hs-varid'>uprags</span><span class='hs-layout'>)</span>	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>uprags'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-53"></a>
<a name="line-54"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstDecl</span> <span class='hs-varid'>inst_ty'</span> <span class='hs-varid'>mbinds'</span> <span class='hs-varid'>uprags'</span> <span class='hs-varid'>ats'</span><span class='hs-layout'>,</span>
<a name="line-55"></a>	     <span class='hs-varid'>meth_fvs</span> <span class='hs-varop'>`plusFV`</span> <span class='hs-varid'>at_fvs</span>
<a name="line-56"></a>		      <span class='hs-varop'>`plusFV`</span> <span class='hs-varid'>hsSigsFVs</span> <span class='hs-varid'>uprags'</span>
<a name="line-57"></a>		      <span class='hs-varop'>`plusFV`</span> <span class='hs-varid'>extractHsTyNames</span> <span class='hs-varid'>inst_ty'</span><span class='hs-layout'>)</span>
<a name="line-58"></a>             <span class='hs-comment'>-- We return the renamed associated data type declarations so</span>
<a name="line-59"></a>             <span class='hs-comment'>-- that they can be entered into the list of type declarations</span>
<a name="line-60"></a>             <span class='hs-comment'>-- for the binding group, but we also keep a copy in the instance.</span>
<a name="line-61"></a>             <span class='hs-comment'>-- The latter is needed for well-formedness checks in the type</span>
<a name="line-62"></a>             <span class='hs-comment'>-- checker (eg, to ensure that all ATs of the instance actually</span>
<a name="line-63"></a>             <span class='hs-comment'>-- receive a declaration). </span>
<a name="line-64"></a>	     <span class='hs-comment'>-- NB: Even the copies in the instance declaration carry copies of</span>
<a name="line-65"></a>	     <span class='hs-comment'>--     the instance context after renaming.  This is a bit</span>
<a name="line-66"></a>	     <span class='hs-comment'>--     strange, but should not matter (and it would be more work</span>
<a name="line-67"></a>	     <span class='hs-comment'>--     to remove the context).</span>
</pre>\end{code}

Renaming of the associated types in instances.  

\begin{code}
<pre><a name="line-1"></a><a name="rnATInsts"></a><span class='hs-definition'>rnATInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LTyClDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>LTyClDecl</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>rnATInsts</span> <span class='hs-varid'>atDecls</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnList</span> <span class='hs-varid'>rnATInst</span> <span class='hs-varid'>atDecls</span>
<a name="line-3"></a>  <span class='hs-keyword'>where</span>
<a name="line-4"></a>    <span class='hs-varid'>rnATInst</span> <span class='hs-varid'>tydecl</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>TyData</span>     <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnTyClDecl</span> <span class='hs-varid'>tydecl</span>
<a name="line-5"></a>    <span class='hs-varid'>rnATInst</span> <span class='hs-varid'>tydecl</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>TySynonym</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnTyClDecl</span> <span class='hs-varid'>tydecl</span>
<a name="line-6"></a>    <span class='hs-varid'>rnATInst</span> <span class='hs-varid'>tydecl</span>               <span class='hs-keyglyph'>=</span>
<a name="line-7"></a>      <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"RnSource.rnATInsts: invalid AT instance"</span> 
<a name="line-8"></a>	       <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcdName</span> <span class='hs-varid'>tydecl</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}

For the method bindings in class and instance decls, we extend the 
type variable environment iff -fglasgow-exts

\begin{code}
<pre><a name="line-1"></a><a name="extendTyVarEnvForMethodBinds"></a><span class='hs-definition'>extendTyVarEnvForMethodBinds</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsTyVarBndr</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-2"></a>                             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bag</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsBind</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-3"></a>                             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bag</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsBind</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-4"></a><span class='hs-definition'>extendTyVarEnvForMethodBinds</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>thing_inside</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>scoped_tvs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doptM</span> <span class='hs-conid'>Opt_ScopedTypeVariables</span>
<a name="line-6"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>scoped_tvs</span> <span class='hs-keyword'>then</span>
<a name="line-7"></a>		<span class='hs-varid'>extendTyVarEnvFVRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>hsLTyVarName</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span>
<a name="line-8"></a>	  <span class='hs-keyword'>else</span>
<a name="line-9"></a>		<span class='hs-varid'>thing_inside</span> <span class='hs-layout'>}</span>
</pre>\end{code}

%*********************************************************
%*							*
\subsection{Stand-alone deriving declarations}
%*							*
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnSrcDerivDecl"></a><span class='hs-definition'>rnSrcDerivDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DerivDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>DerivDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>rnSrcDerivDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>DerivDecl</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>standalone_deriv_ok</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doptM</span> <span class='hs-conid'>Opt_StandaloneDeriving</span>
<a name="line-4"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>unless</span> <span class='hs-varid'>standalone_deriv_ok</span> <span class='hs-layout'>(</span><span class='hs-varid'>addErr</span> <span class='hs-varid'>standaloneDerivErr</span><span class='hs-layout'>)</span>
<a name="line-5"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnLHsType</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"a deriving decl"</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-6"></a>       <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>fvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extractHsTyNames</span> <span class='hs-varid'>ty'</span>
<a name="line-7"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DerivDecl</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="standaloneDerivErr"></a><span class='hs-definition'>standaloneDerivErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>
<a name="line-10"></a><span class='hs-definition'>standaloneDerivErr</span> 
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Illegal standalone deriving declaration"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-12"></a>       <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Use -XStandaloneDeriving to enable this extension"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}

%*********************************************************
%*							*
\subsection{Rules}
%*							*
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnHsRuleDecl"></a><span class='hs-definition'>rnHsRuleDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RuleDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>RuleDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>rnHsRuleDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsRule</span> <span class='hs-varid'>rule_name</span> <span class='hs-varid'>act</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>lhs</span> <span class='hs-sel'>_fv_lhs</span> <span class='hs-varid'>rhs</span> <span class='hs-sel'>_fv_rhs</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindPatSigTyVarsFV</span> <span class='hs-layout'>(</span><span class='hs-varid'>collectRuleBndrSigTys</span> <span class='hs-varid'>vars</span><span class='hs-layout'>)</span>	<span class='hs-varop'>$</span>
<a name="line-4"></a>    <span class='hs-varid'>bindLocatedLocalsFV</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>get_var</span> <span class='hs-varid'>vars</span><span class='hs-layout'>)</span>		<span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>ids</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-5"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>vars'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fv_vars</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapFvRn</span> <span class='hs-varid'>rn_var</span> <span class='hs-layout'>(</span><span class='hs-varid'>vars</span> <span class='hs-varop'>`zip`</span> <span class='hs-varid'>ids</span><span class='hs-layout'>)</span>
<a name="line-6"></a>		<span class='hs-comment'>-- NB: The binders in a rule are always Ids</span>
<a name="line-7"></a>		<span class='hs-comment'>--     We don't (yet) support type variables</span>
<a name="line-8"></a>
<a name="line-9"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>lhs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fv_lhs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnLExpr</span> <span class='hs-varid'>lhs</span>
<a name="line-10"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>rhs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fv_rhs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnLExpr</span> <span class='hs-varid'>rhs</span>
<a name="line-11"></a>
<a name="line-12"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkValidRule</span> <span class='hs-varid'>rule_name</span> <span class='hs-varid'>ids</span> <span class='hs-varid'>lhs'</span> <span class='hs-varid'>fv_lhs'</span>
<a name="line-13"></a>
<a name="line-14"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsRule</span> <span class='hs-varid'>rule_name</span> <span class='hs-varid'>act</span> <span class='hs-varid'>vars'</span> <span class='hs-varid'>lhs'</span> <span class='hs-varid'>fv_lhs'</span> <span class='hs-varid'>rhs'</span> <span class='hs-varid'>fv_rhs'</span><span class='hs-layout'>,</span>
<a name="line-15"></a>		  <span class='hs-varid'>fv_vars</span> <span class='hs-varop'>`plusFV`</span> <span class='hs-varid'>fv_lhs'</span> <span class='hs-varop'>`plusFV`</span> <span class='hs-varid'>fv_rhs'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-16"></a>  <span class='hs-keyword'>where</span>
<a name="line-17"></a>    <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"In the transformation rule"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ftext</span> <span class='hs-varid'>rule_name</span>
<a name="line-18"></a>  
<a name="line-19"></a>    <span class='hs-varid'>get_var</span> <span class='hs-layout'>(</span><span class='hs-conid'>RuleBndr</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span>
<a name="line-20"></a>    <span class='hs-varid'>get_var</span> <span class='hs-layout'>(</span><span class='hs-conid'>RuleBndrSig</span> <span class='hs-varid'>v</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span>
<a name="line-21"></a>
<a name="line-22"></a>    <span class='hs-varid'>rn_var</span> <span class='hs-layout'>(</span><span class='hs-conid'>RuleBndr</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-23"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>RuleBndr</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyFVs</span><span class='hs-layout'>)</span>
<a name="line-24"></a>    <span class='hs-varid'>rn_var</span> <span class='hs-layout'>(</span><span class='hs-conid'>RuleBndrSig</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span><span class='hs-layout'>,</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-25"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnHsTypeFVs</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>t</span>	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>t'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-26"></a>	  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>RuleBndrSig</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-varid'>t'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="badRuleVar"></a><span class='hs-definition'>badRuleVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-29"></a><span class='hs-definition'>badRuleVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>var</span>
<a name="line-30"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Rule"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>doubleQuotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ftext</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>colon</span><span class='hs-layout'>,</span>
<a name="line-31"></a>	 <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Forall'd variable"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>var</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-32"></a>		<span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"does not appear on left hand side"</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

Note [Rule LHS validity checking]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Check the shape of a transformation rule LHS.  Currently we only allow
LHSs of the form @(f e1 .. en)@, where @f@ is not one of the
@forall@'d variables.  

We used restrict the form of the 'ei' to prevent you writing rules
with LHSs with a complicated desugaring (and hence unlikely to match);
(e.g. a case expression is not allowed: too elaborate.)

But there are legitimate non-trivial args ei, like sections and
lambdas.  So it seems simmpler not to check at all, and that is why
check_e is commented out.
	
\begin{code}
<pre><a name="line-1"></a><a name="checkValidRule"></a><span class='hs-definition'>checkValidRule</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-conid'>()</span>
<a name="line-2"></a><span class='hs-definition'>checkValidRule</span> <span class='hs-varid'>rule_name</span> <span class='hs-varid'>ids</span> <span class='hs-varid'>lhs'</span> <span class='hs-varid'>fv_lhs'</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> 	<span class='hs-comment'>-- Check for the form of the LHS</span>
<a name="line-4"></a>	  <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>validRuleLhs</span> <span class='hs-varid'>ids</span> <span class='hs-varid'>lhs'</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-5"></a>		<span class='hs-conid'>Nothing</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-6"></a>		<span class='hs-conid'>Just</span> <span class='hs-varid'>bad</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>badRuleLhsErr</span> <span class='hs-varid'>rule_name</span> <span class='hs-varid'>lhs'</span> <span class='hs-varid'>bad</span><span class='hs-layout'>)</span>
<a name="line-7"></a>
<a name="line-8"></a>		<span class='hs-comment'>-- Check that LHS vars are all bound</span>
<a name="line-9"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>bad_vars</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>var</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>var</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ids</span><span class='hs-layout'>,</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>var</span> <span class='hs-varop'>`elemNameSet`</span> <span class='hs-varid'>fv_lhs'</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-10"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-varid'>addErr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>badRuleVar</span> <span class='hs-varid'>rule_name</span><span class='hs-layout'>)</span> <span class='hs-varid'>bad_vars</span> <span class='hs-layout'>}</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="validRuleLhs"></a><span class='hs-definition'>validRuleLhs</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsExpr</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-13"></a><span class='hs-comment'>-- Nothing =&gt; OK</span>
<a name="line-14"></a><span class='hs-comment'>-- Just e  =&gt; Not ok, and e is the offending expression</span>
<a name="line-15"></a><span class='hs-definition'>validRuleLhs</span> <span class='hs-varid'>foralls</span> <span class='hs-varid'>lhs</span>
<a name="line-16"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>checkl</span> <span class='hs-varid'>lhs</span>
<a name="line-17"></a>  <span class='hs-keyword'>where</span>
<a name="line-18"></a>    <span class='hs-varid'>checkl</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>check</span> <span class='hs-varid'>e</span>
<a name="line-19"></a>
<a name="line-20"></a>    <span class='hs-varid'>check</span> <span class='hs-layout'>(</span><span class='hs-conid'>OpApp</span> <span class='hs-varid'>e1</span> <span class='hs-varid'>op</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>e2</span><span class='hs-layout'>)</span>		  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>checkl</span> <span class='hs-varid'>op</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>checkl_e</span> <span class='hs-varid'>e1</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>checkl_e</span> <span class='hs-varid'>e2</span>
<a name="line-21"></a>    <span class='hs-varid'>check</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsApp</span> <span class='hs-varid'>e1</span> <span class='hs-varid'>e2</span><span class='hs-layout'>)</span> 		  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>checkl</span> <span class='hs-varid'>e1</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>checkl_e</span> <span class='hs-varid'>e2</span>
<a name="line-22"></a>    <span class='hs-varid'>check</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsVar</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`notElem`</span> <span class='hs-varid'>foralls</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-23"></a>    <span class='hs-varid'>check</span> <span class='hs-varid'>other</span>				  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>other</span> 	<span class='hs-comment'>-- Failure</span>
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-comment'>-- Check an argument</span>
<a name="line-26"></a>    <span class='hs-varid'>checkl_e</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-sel'>_e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span> 	<span class='hs-comment'>-- Was (check_e e); see Note [Rule LHS validity checking]</span>
<a name="line-27"></a>
<a name="line-28"></a><span class='hs-comment'>{-	Commented out; see Note [Rule LHS validity checking] above 
<a name="line-29"></a>    check_e (HsVar v)     = Nothing
<a name="line-30"></a>    check_e (HsPar e) 	  = checkl_e e
<a name="line-31"></a>    check_e (HsLit e) 	  = Nothing
<a name="line-32"></a>    check_e (HsOverLit e) = Nothing
<a name="line-33"></a>
<a name="line-34"></a>    check_e (OpApp e1 op _ e2) 	 = checkl_e e1 `mplus` checkl_e op `mplus` checkl_e e2
<a name="line-35"></a>    check_e (HsApp e1 e2)      	 = checkl_e e1 `mplus` checkl_e e2
<a name="line-36"></a>    check_e (NegApp e _)       	 = checkl_e e
<a name="line-37"></a>    check_e (ExplicitList _ es)	 = checkl_es es
<a name="line-38"></a>    check_e other		 = Just other	-- Fails
<a name="line-39"></a>
<a name="line-40"></a>    checkl_es es = foldr (mplus . checkl_e) Nothing es
<a name="line-41"></a>-}</span>
<a name="line-42"></a>
<a name="line-43"></a><a name="badRuleLhsErr"></a><span class='hs-definition'>badRuleLhsErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-44"></a><span class='hs-definition'>badRuleLhsErr</span> <span class='hs-varid'>name</span> <span class='hs-varid'>lhs</span> <span class='hs-varid'>bad_e</span>
<a name="line-45"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Rule"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ftext</span> <span class='hs-varid'>name</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>colon</span><span class='hs-layout'>,</span>
<a name="line-46"></a>	 <span class='hs-varid'>nest</span> <span class='hs-num'>4</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Illegal expression:"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>bad_e</span><span class='hs-layout'>,</span> 
<a name="line-47"></a>		       <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"in left-hand side:"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>lhs</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-48"></a>    <span class='hs-varop'>$$</span>
<a name="line-49"></a>    <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"LHS must be of form (f e1 .. en) where f is not forall'd"</span><span class='hs-layout'>)</span>
</pre>\end{code}


%*********************************************************
%*							*
\subsection{Type, class and iface sig declarations}
%*							*
%*********************************************************

@rnTyDecl@ uses the `global name function' to create a new type
declaration in which local names have been replaced by their original
names, reporting any unknown names.

Renaming type variables is a pain. Because they now contain uniques,
it is necessary to pass in an association list which maps a parsed
tyvar to its @Name@ representation.
In some cases (type signatures of values),
it is even necessary to go over the type first
in order to get the set of tyvars used by it, make an assoc list,
and then go over it again to rename the tyvars!
However, we can also do some scoping checks at the same time.

\begin{code}
<pre><a name="line-1"></a><a name="rnTyClDecl"></a><span class='hs-definition'>rnTyClDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyClDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyClDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>rnTyClDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignType</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdExtName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ext_name</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span> <span class='hs-varid'>name</span>		<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>name'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-4"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignType</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdExtName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ext_name</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span>
<a name="line-5"></a>	     <span class='hs-varid'>emptyFVs</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-comment'>-- all flavours of type family declarations ("type family", "newtype fanily",</span>
<a name="line-8"></a><span class='hs-comment'>-- and "data family")</span>
<a name="line-9"></a><span class='hs-definition'>rnTyClDecl</span> <span class='hs-layout'>(</span><span class='hs-varid'>tydecl</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>TyFamily</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-10"></a>  <span class='hs-varid'>rnFamily</span> <span class='hs-varid'>tydecl</span> <span class='hs-varid'>bindTyVarsRn</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-comment'>-- "data", "newtype", "data instance, and "newtype instance" declarations</span>
<a name="line-13"></a><span class='hs-definition'>rnTyClDecl</span> <span class='hs-varid'>tydecl</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>TyData</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdND</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_or_data</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdCtxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>context</span><span class='hs-layout'>,</span> 
<a name="line-14"></a>			   <span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> 
<a name="line-15"></a>			   <span class='hs-varid'>tcdTyPats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>typatsMaybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdCons</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>condecls</span><span class='hs-layout'>,</span> 
<a name="line-16"></a>			   <span class='hs-varid'>tcdKindSig</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sig</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdDerivs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>derivs</span><span class='hs-layout'>}</span>
<a name="line-17"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>tycon'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isFamInstDecl</span> <span class='hs-varid'>tydecl</span>
<a name="line-18"></a>		    <span class='hs-keyword'>then</span> <span class='hs-varid'>lookupLocatedOccRn</span>     <span class='hs-varid'>tycon</span> <span class='hs-comment'>-- may be imported family</span>
<a name="line-19"></a>		    <span class='hs-keyword'>else</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span> <span class='hs-varid'>tycon</span>
<a name="line-20"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>h98_style</span> <span class='hs-varop'>||</span> <span class='hs-varid'>null</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>context</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
<a name="line-21"></a>                  <span class='hs-layout'>(</span><span class='hs-varid'>badGadtStupidTheta</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span>
<a name="line-22"></a>    	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyvars'</span><span class='hs-layout'>,</span> <span class='hs-varid'>context'</span><span class='hs-layout'>,</span> <span class='hs-varid'>typats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>derivs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>deriv_fvs</span><span class='hs-layout'>)</span>
<a name="line-23"></a>		<span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>bindTyVarsRn</span> <span class='hs-varid'>tyvars</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tyvars'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-24"></a>		         	 <span class='hs-comment'>-- Checks for distinct tyvars</span>
<a name="line-25"></a>		   <span class='hs-layout'>{</span> <span class='hs-varid'>typats'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnTyPats</span> <span class='hs-varid'>data_doc</span> <span class='hs-varid'>typatsMaybe</span>
<a name="line-26"></a>                   <span class='hs-layout'>;</span> <span class='hs-varid'>context'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnContext</span> <span class='hs-varid'>data_doc</span> <span class='hs-varid'>context</span>
<a name="line-27"></a>                   <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>derivs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>deriv_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rn_derivs</span> <span class='hs-varid'>derivs</span>
<a name="line-28"></a>		   <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyvars'</span><span class='hs-layout'>,</span> <span class='hs-varid'>context'</span><span class='hs-layout'>,</span> <span class='hs-varid'>typats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>derivs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>deriv_fvs</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-29"></a>		<span class='hs-comment'>-- For GADTs, the type variables in the declaration </span>
<a name="line-30"></a>		<span class='hs-comment'>-- do not scope over the constructor signatures</span>
<a name="line-31"></a>		<span class='hs-comment'>-- 	data T a where { T1 :: forall b. b-&gt; b }</span>
<a name="line-32"></a>
<a name="line-33"></a>	<span class='hs-comment'>-- For the constructor declarations, bring into scope the tyvars </span>
<a name="line-34"></a>	<span class='hs-comment'>-- bound by the header, but *only* in the H98 case</span>
<a name="line-35"></a>        <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>tc_tvs_in_scope</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>h98_style</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsLTyVarNames</span> <span class='hs-varid'>tyvars'</span>
<a name="line-36"></a>                              <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-37"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>condecls'</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>bindLocalNamesFV</span> <span class='hs-varid'>tc_tvs_in_scope</span> <span class='hs-varop'>$</span>
<a name="line-38"></a>                                  <span class='hs-varid'>rnConDecls</span> <span class='hs-varid'>condecls</span>
<a name="line-39"></a>		<span class='hs-comment'>-- No need to check for duplicate constructor decls</span>
<a name="line-40"></a>		<span class='hs-comment'>-- since that is done by RnNames.extendGlobalRdrEnvRn</span>
<a name="line-41"></a>
<a name="line-42"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyData</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdND</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_or_data</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdCtxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>context'</span><span class='hs-layout'>,</span> 
<a name="line-43"></a>			   <span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tycon'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyvars'</span><span class='hs-layout'>,</span> 
<a name="line-44"></a>			   <span class='hs-varid'>tcdTyPats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>typats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdKindSig</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sig</span><span class='hs-layout'>,</span>
<a name="line-45"></a>			   <span class='hs-varid'>tcdCons</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>condecls'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdDerivs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>derivs'</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
<a name="line-46"></a>	     	   <span class='hs-varid'>con_fvs</span>              <span class='hs-varop'>`plusFV`</span> 
<a name="line-47"></a>		   <span class='hs-varid'>deriv_fvs</span>		<span class='hs-varop'>`plusFV`</span>
<a name="line-48"></a>		   <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-varid'>isFamInstDecl</span> <span class='hs-varid'>tydecl</span>
<a name="line-49"></a>		   <span class='hs-keyword'>then</span> <span class='hs-varid'>unitFV</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>tycon'</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- type instance =&gt; use</span>
<a name="line-50"></a>		   <span class='hs-keyword'>else</span> <span class='hs-varid'>emptyFVs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-51"></a>        <span class='hs-layout'>}</span>
<a name="line-52"></a>  <span class='hs-keyword'>where</span>
<a name="line-53"></a>    <span class='hs-varid'>h98_style</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>condecls</span> <span class='hs-keyword'>of</span>	 <span class='hs-comment'>-- Note [Stupid theta]</span>
<a name="line-54"></a>		     <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConDecl</span> <span class='hs-layout'>{</span> <span class='hs-varid'>con_res</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ResTyGADT</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-55"></a>		     <span class='hs-keyword'>_</span>    		                           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-56"></a>               		     						  
<a name="line-57"></a>    <span class='hs-varid'>data_doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"In the data type declaration for"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span>
<a name="line-58"></a>
<a name="line-59"></a>    <span class='hs-varid'>rn_derivs</span> <span class='hs-conid'>Nothing</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyFVs</span><span class='hs-layout'>)</span>
<a name="line-60"></a>    <span class='hs-varid'>rn_derivs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnLHsTypes</span> <span class='hs-varid'>data_doc</span> <span class='hs-varid'>ds</span>	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>ds'</span> <span class='hs-keyglyph'>-&gt;</span> 
<a name="line-61"></a>			  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>ds'</span><span class='hs-layout'>,</span> <span class='hs-varid'>extractHsTyNames_s</span> <span class='hs-varid'>ds'</span><span class='hs-layout'>)</span>
<a name="line-62"></a>
<a name="line-63"></a><span class='hs-comment'>-- "type" and "type instance" declarations</span>
<a name="line-64"></a><span class='hs-definition'>rnTyClDecl</span> <span class='hs-varid'>tydecl</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>TySynonym</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span>
<a name="line-65"></a>			      <span class='hs-varid'>tcdTyPats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>typatsMaybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdSynRhs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-66"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindTyVarsRn</span> <span class='hs-varid'>tyvars</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tyvars'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-67"></a>    <span class='hs-layout'>{</span>    	 <span class='hs-comment'>-- Checks for distinct tyvars</span>
<a name="line-68"></a>      <span class='hs-varid'>name'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isFamInstDecl</span> <span class='hs-varid'>tydecl</span>
<a name="line-69"></a>    		  <span class='hs-keyword'>then</span> <span class='hs-varid'>lookupLocatedOccRn</span>     <span class='hs-varid'>name</span> <span class='hs-comment'>-- may be imported family</span>
<a name="line-70"></a>    		  <span class='hs-keyword'>else</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span> <span class='hs-varid'>name</span>
<a name="line-71"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>typats'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnTyPats</span> <span class='hs-varid'>syn_doc</span> <span class='hs-varid'>typatsMaybe</span>
<a name="line-72"></a>    <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnHsTypeFVs</span> <span class='hs-varid'>syn_doc</span> <span class='hs-varid'>ty</span>
<a name="line-73"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TySynonym</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyvars'</span> 
<a name="line-74"></a>    			<span class='hs-layout'>,</span> <span class='hs-varid'>tcdTyPats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>typats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdSynRhs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span>
<a name="line-75"></a>    	      <span class='hs-varid'>delFVs</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>hsLTyVarName</span> <span class='hs-varid'>tyvars'</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-76"></a>    	      <span class='hs-varid'>fvs</span>			      <span class='hs-varop'>`plusFV`</span>
<a name="line-77"></a>    	       <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-varid'>isFamInstDecl</span> <span class='hs-varid'>tydecl</span>
<a name="line-78"></a>    	       <span class='hs-keyword'>then</span> <span class='hs-varid'>unitFV</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>name'</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- type instance =&gt; use</span>
<a name="line-79"></a>    	       <span class='hs-keyword'>else</span> <span class='hs-varid'>emptyFVs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-80"></a>    <span class='hs-layout'>}</span>
<a name="line-81"></a>  <span class='hs-keyword'>where</span>
<a name="line-82"></a>    <span class='hs-varid'>syn_doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"In the declaration for type synonym"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-83"></a>
<a name="line-84"></a><span class='hs-definition'>rnTyClDecl</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassDecl</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdCtxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>context</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cname</span><span class='hs-layout'>,</span> 
<a name="line-85"></a>		       <span class='hs-varid'>tcdTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdFDs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fds</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdSigs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sigs</span><span class='hs-layout'>,</span> 
<a name="line-86"></a>		       <span class='hs-varid'>tcdMeths</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mbinds</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdATs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ats</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdDocs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>docs</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-87"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>cname'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span> <span class='hs-varid'>cname</span>
<a name="line-88"></a>
<a name="line-89"></a>	<span class='hs-comment'>-- Tyvars scope over superclass context and method signatures</span>
<a name="line-90"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyvars'</span><span class='hs-layout'>,</span> <span class='hs-varid'>context'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fds'</span><span class='hs-layout'>,</span> <span class='hs-varid'>ats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>ats_fvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>sigs'</span><span class='hs-layout'>)</span>
<a name="line-91"></a>	    <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>bindTyVarsRn</span> <span class='hs-varid'>tyvars</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tyvars'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-92"></a>         	 <span class='hs-comment'>-- Checks for distinct tyvars</span>
<a name="line-93"></a>	     <span class='hs-layout'>{</span> <span class='hs-varid'>context'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnContext</span> <span class='hs-varid'>cls_doc</span> <span class='hs-varid'>context</span>
<a name="line-94"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>fds'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnFds</span> <span class='hs-varid'>cls_doc</span> <span class='hs-varid'>fds</span>
<a name="line-95"></a>	     <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>ats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>ats_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnATs</span> <span class='hs-varid'>ats</span>
<a name="line-96"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>sigs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>renameSigs</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>okClsDclSig</span> <span class='hs-varid'>sigs</span>
<a name="line-97"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span>   <span class='hs-layout'>(</span><span class='hs-varid'>tyvars'</span><span class='hs-layout'>,</span> <span class='hs-varid'>context'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fds'</span><span class='hs-layout'>,</span> <span class='hs-varid'>ats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>ats_fvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>sigs'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-98"></a>
<a name="line-99"></a>	<span class='hs-comment'>-- No need to check for duplicate associated type decls</span>
<a name="line-100"></a>	<span class='hs-comment'>-- since that is done by RnNames.extendGlobalRdrEnvRn</span>
<a name="line-101"></a>
<a name="line-102"></a>	<span class='hs-comment'>-- Check the signatures</span>
<a name="line-103"></a>	<span class='hs-comment'>-- First process the class op sigs (op_sigs), then the fixity sigs (non_op_sigs).</span>
<a name="line-104"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>sig_rdr_names_w_locs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>op</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>TypeSig</span> <span class='hs-varid'>op</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>sigs</span><span class='hs-keyglyph'>]</span>
<a name="line-105"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkDupRdrNames</span> <span class='hs-varid'>sig_rdr_names_w_locs</span>
<a name="line-106"></a>		<span class='hs-comment'>-- Typechecker is responsible for checking that we only</span>
<a name="line-107"></a>		<span class='hs-comment'>-- give default-method bindings for things in this class.</span>
<a name="line-108"></a>		<span class='hs-comment'>-- The renamer *could* check this for class decls, but can't</span>
<a name="line-109"></a>		<span class='hs-comment'>-- for instance decls.</span>
<a name="line-110"></a>
<a name="line-111"></a>   	<span class='hs-comment'>-- The newLocals call is tiresome: given a generic class decl</span>
<a name="line-112"></a>	<span class='hs-comment'>--	class C a where</span>
<a name="line-113"></a>	<span class='hs-comment'>--	  op :: a -&gt; a</span>
<a name="line-114"></a>	<span class='hs-comment'>--	  op {| x+y |} (Inl a) = ...</span>
<a name="line-115"></a>	<span class='hs-comment'>--	  op {| x+y |} (Inr b) = ...</span>
<a name="line-116"></a>	<span class='hs-comment'>--	  op {| a*b |} (a*b)   = ...</span>
<a name="line-117"></a>	<span class='hs-comment'>-- we want to name both "x" tyvars with the same unique, so that they are</span>
<a name="line-118"></a>	<span class='hs-comment'>-- easy to group together in the typechecker.  </span>
<a name="line-119"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>mbinds'</span><span class='hs-layout'>,</span> <span class='hs-varid'>meth_fvs</span><span class='hs-layout'>)</span> 
<a name="line-120"></a>	    <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>extendTyVarEnvForMethodBinds</span> <span class='hs-varid'>tyvars'</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-121"></a>	    <span class='hs-layout'>{</span> <span class='hs-varid'>name_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLocalRdrEnv</span>
<a name="line-122"></a>	    <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>gen_rdr_tyvars_w_locs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>extractGenericPatTyVars</span> <span class='hs-varid'>mbinds</span><span class='hs-layout'>,</span>
<a name="line-123"></a>	    		 		         <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>tv</span> <span class='hs-varop'>`elemLocalRdrEnv`</span> <span class='hs-varid'>name_env</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>
<a name="line-124"></a>		<span class='hs-comment'>-- No need to check for duplicate method signatures</span>
<a name="line-125"></a>		<span class='hs-comment'>-- since that is done by RnNames.extendGlobalRdrEnvRn</span>
<a name="line-126"></a>		<span class='hs-comment'>-- and the methods are already in scope</span>
<a name="line-127"></a>	    <span class='hs-layout'>;</span> <span class='hs-varid'>gen_tyvars</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newLocalBndrsRn</span> <span class='hs-varid'>gen_rdr_tyvars_w_locs</span>
<a name="line-128"></a>	    <span class='hs-layout'>;</span> <span class='hs-varid'>rnMethodBinds</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>cname'</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSigTvFn</span> <span class='hs-varid'>sigs'</span><span class='hs-layout'>)</span> <span class='hs-varid'>gen_tyvars</span> <span class='hs-varid'>mbinds</span> <span class='hs-layout'>}</span>
<a name="line-129"></a>
<a name="line-130"></a>  <span class='hs-comment'>-- Haddock docs </span>
<a name="line-131"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>docs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrapLocM</span> <span class='hs-varid'>rnDocDecl</span><span class='hs-layout'>)</span> <span class='hs-varid'>docs</span>
<a name="line-132"></a>
<a name="line-133"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassDecl</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tcdCtxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>context'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cname'</span><span class='hs-layout'>,</span> 
<a name="line-134"></a>			      <span class='hs-varid'>tcdTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyvars'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdFDs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fds'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdSigs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sigs'</span><span class='hs-layout'>,</span>
<a name="line-135"></a>			      <span class='hs-varid'>tcdMeths</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mbinds'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdATs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ats'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdDocs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>docs'</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span>
<a name="line-136"></a>
<a name="line-137"></a>	     	  <span class='hs-varid'>delFVs</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>hsLTyVarName</span> <span class='hs-varid'>tyvars'</span><span class='hs-layout'>)</span>	<span class='hs-varop'>$</span>
<a name="line-138"></a>	     	  <span class='hs-varid'>extractHsCtxtTyNames</span> <span class='hs-varid'>context'</span>	    	<span class='hs-varop'>`plusFV`</span>
<a name="line-139"></a>	     	  <span class='hs-varid'>plusFVs</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>extractFunDepNames</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>fds'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>  <span class='hs-varop'>`plusFV`</span>
<a name="line-140"></a>	     	  <span class='hs-varid'>hsSigsFVs</span> <span class='hs-varid'>sigs'</span>		  	<span class='hs-varop'>`plusFV`</span>
<a name="line-141"></a>	     	  <span class='hs-varid'>meth_fvs</span>				<span class='hs-varop'>`plusFV`</span>
<a name="line-142"></a>	     	  <span class='hs-varid'>ats_fvs</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-143"></a>  <span class='hs-keyword'>where</span>
<a name="line-144"></a>    <span class='hs-varid'>cls_doc</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"In the declaration for class"</span> 	<span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>cname</span>
<a name="line-145"></a>
<a name="line-146"></a><a name="badGadtStupidTheta"></a><span class='hs-definition'>badGadtStupidTheta</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Located</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-147"></a><span class='hs-definition'>badGadtStupidTheta</span> <span class='hs-keyword'>_</span>
<a name="line-148"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"No context is allowed on a GADT-style data declaration"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-149"></a>	  <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"(You can put a context on each contructor, though.)"</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

Note [Stupid theta]
~~~~~~~~~~~~~~~~~~~
Trac #3850 complains about a regression wrt 6.10 for 
     data Show a => T a
There is no reason not to allow the stupid theta if there are no data
constructors.  It's still stupid, but does no harm, and I don't want
to cause programs to break unnecessarily (notably HList).  So if there
are no data constructors we allow h98_style = True


%*********************************************************
%*							*
\subsection{Support code for type/data declarations}
%*							*
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnTyPats"></a><span class='hs-definition'>rnTyPats</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-comment'>-- Although, we are processing type patterns here, all type variables will</span>
<a name="line-3"></a><span class='hs-comment'>-- already be in scope (they are the same as in the 'tcdTyVars' field of the</span>
<a name="line-4"></a><span class='hs-comment'>-- type declaration to which these patterns belong)</span>
<a name="line-5"></a><span class='hs-definition'>rnTyPats</span> <span class='hs-keyword'>_</span>   <span class='hs-conid'>Nothing</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-6"></a><span class='hs-definition'>rnTyPats</span> <span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>typats</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>rnLHsTypes</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>typats</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="rnConDecls"></a><span class='hs-definition'>rnConDecls</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LConDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>LConDecl</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-9"></a><span class='hs-definition'>rnConDecls</span> <span class='hs-varid'>condecls</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>condecls'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrapLocM</span> <span class='hs-varid'>rnConDecl</span><span class='hs-layout'>)</span> <span class='hs-varid'>condecls</span>
<a name="line-11"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>condecls'</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusFVs</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>conDeclFVs</span> <span class='hs-varid'>condecls'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="rnConDecl"></a><span class='hs-definition'>rnConDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ConDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-14"></a><span class='hs-definition'>rnConDecl</span> <span class='hs-varid'>decl</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ConDecl</span> <span class='hs-layout'>{</span> <span class='hs-varid'>con_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_qvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tvs</span>
<a name="line-15"></a>                   	       <span class='hs-layout'>,</span> <span class='hs-varid'>con_cxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cxt</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_details</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>details</span>
<a name="line-16"></a>                   	       <span class='hs-layout'>,</span> <span class='hs-varid'>con_res</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_doc</span>
<a name="line-17"></a>                   	       <span class='hs-layout'>,</span> <span class='hs-varid'>con_old_rec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>old_rec</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_explicit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>expl</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-18"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>addLocM</span> <span class='hs-varid'>checkConName</span> <span class='hs-varid'>name</span>
<a name="line-19"></a>    	<span class='hs-layout'>;</span> <span class='hs-varid'>when</span> <span class='hs-varid'>old_rec</span> <span class='hs-layout'>(</span><span class='hs-varid'>addWarn</span> <span class='hs-layout'>(</span><span class='hs-varid'>deprecRecSyntax</span> <span class='hs-varid'>decl</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-20"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>new_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span> <span class='hs-varid'>name</span>
<a name="line-21"></a>
<a name="line-22"></a>    	   <span class='hs-comment'>-- For H98 syntax, the tvs are the existential ones</span>
<a name="line-23"></a>	   <span class='hs-comment'>-- For GADT syntax, the tvs are all the quantified tyvars</span>
<a name="line-24"></a>	   <span class='hs-comment'>-- Hence the 'filter' in the ResTyH98 case only</span>
<a name="line-25"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>rdr_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLocalRdrEnv</span>
<a name="line-26"></a>        <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>in_scope</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>`elemLocalRdrEnv`</span> <span class='hs-varid'>rdr_env</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>unLoc</span>
<a name="line-27"></a>	      <span class='hs-varid'>arg_tys</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsConDeclArgTys</span> <span class='hs-varid'>details</span>
<a name="line-28"></a>	      <span class='hs-varid'>implicit_tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>res_ty</span> <span class='hs-keyword'>of</span>
<a name="line-29"></a>	      	    	       <span class='hs-conid'>ResTyH98</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>filterOut</span> <span class='hs-varid'>in_scope</span> <span class='hs-layout'>(</span><span class='hs-varid'>get_rdr_tvs</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span>
<a name="line-30"></a>	      	    	       <span class='hs-conid'>ResTyGADT</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>get_rdr_tvs</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty</span> <span class='hs-conop'>:</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span>
<a name="line-31"></a>	      <span class='hs-varid'>new_tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>expl</span> <span class='hs-keyword'>of</span>
<a name="line-32"></a>	        	  <span class='hs-conid'>Explicit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tvs</span>
<a name="line-33"></a>		    	  <span class='hs-conid'>Implicit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>userHsTyVarBndrs</span> <span class='hs-varid'>implicit_tvs</span>
<a name="line-34"></a>
<a name="line-35"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>mb_doc'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnMbLHsDoc</span> <span class='hs-varid'>mb_doc</span> 
<a name="line-36"></a>
<a name="line-37"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>bindTyVarsRn</span> <span class='hs-varid'>new_tvs</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>new_tyvars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-38"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>new_context</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnContext</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>cxt</span>
<a name="line-39"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>new_details</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnConDeclDetails</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>details</span>
<a name="line-40"></a>        <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>new_details'</span><span class='hs-layout'>,</span> <span class='hs-varid'>new_res_ty</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnConResult</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>new_details</span> <span class='hs-varid'>res_ty</span>
<a name="line-41"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>decl</span> <span class='hs-layout'>{</span> <span class='hs-varid'>con_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_qvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_tyvars</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_cxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_context</span> 
<a name="line-42"></a>                       <span class='hs-layout'>,</span> <span class='hs-varid'>con_details</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_details'</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_res</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_res_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_doc'</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-43"></a> <span class='hs-keyword'>where</span>
<a name="line-44"></a>    <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"In the definition of data constructor"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-45"></a>    <span class='hs-varid'>get_rdr_tvs</span> <span class='hs-varid'>tys</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extractHsRhoRdrTyVars</span> <span class='hs-varid'>cxt</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTupleTy</span> <span class='hs-conid'>Boxed</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="rnConResult"></a><span class='hs-definition'>rnConResult</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>
<a name="line-48"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsConDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ConDeclField</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-49"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ResType</span> <span class='hs-conid'>RdrName</span>
<a name="line-50"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsConDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ConDeclField</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-51"></a>                    <span class='hs-conid'>ResType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-52"></a><span class='hs-definition'>rnConResult</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>details</span> <span class='hs-conid'>ResTyH98</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>details</span><span class='hs-layout'>,</span> <span class='hs-conid'>ResTyH98</span><span class='hs-layout'>)</span>
<a name="line-53"></a><span class='hs-definition'>rnConResult</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>details</span> <span class='hs-layout'>(</span><span class='hs-conid'>ResTyGADT</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-54"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnLHsType</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>ty</span>
<a name="line-55"></a>       <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>arg_tys</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitHsFunType</span> <span class='hs-varid'>ty'</span>
<a name="line-56"></a>          	<span class='hs-comment'>-- We can finally split it up, </span>
<a name="line-57"></a>		<span class='hs-comment'>-- now the renamer has dealt with fixities</span>
<a name="line-58"></a>	        <span class='hs-comment'>-- See Note [Sorting out the result type] in RdrHsSyn</span>
<a name="line-59"></a>
<a name="line-60"></a>             <span class='hs-varid'>details'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>details</span> <span class='hs-keyword'>of</span>
<a name="line-61"></a>       	     	           <span class='hs-conid'>RecCon</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>details</span>
<a name="line-62"></a>			   <span class='hs-conid'>PrefixCon</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-varid'>arg_tys</span>
<a name="line-63"></a>			   <span class='hs-conid'>InfixCon</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"rnConResult"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-64"></a>			  <span class='hs-comment'>-- See Note [Sorting out the result type] in RdrHsSyn</span>
<a name="line-65"></a>		
<a name="line-66"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>details</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>RecCon</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-67"></a>              <span class='hs-layout'>(</span><span class='hs-varid'>addErr</span> <span class='hs-layout'>(</span><span class='hs-varid'>badRecResTy</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-68"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>details'</span><span class='hs-layout'>,</span> <span class='hs-conid'>ResTyGADT</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="rnConDeclDetails"></a><span class='hs-definition'>rnConDeclDetails</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>
<a name="line-71"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsConDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ConDeclField</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span>
<a name="line-72"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsConDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ConDeclField</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-73"></a><span class='hs-definition'>rnConDeclDetails</span> <span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrefixCon</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-74"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>rnLHsType</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys</span>	<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>new_tys</span>  <span class='hs-keyglyph'>-&gt;</span>
<a name="line-75"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrefixCon</span> <span class='hs-varid'>new_tys</span><span class='hs-layout'>)</span>
<a name="line-76"></a>
<a name="line-77"></a><span class='hs-definition'>rnConDeclDetails</span> <span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-conid'>InfixCon</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-78"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnLHsType</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>ty1</span>  		<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>new_ty1</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-79"></a>    <span class='hs-varid'>rnLHsType</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>ty2</span>  		<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>new_ty2</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-80"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>InfixCon</span> <span class='hs-varid'>new_ty1</span> <span class='hs-varid'>new_ty2</span><span class='hs-layout'>)</span>
<a name="line-81"></a>
<a name="line-82"></a><span class='hs-definition'>rnConDeclDetails</span> <span class='hs-varid'>doc</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCon</span> <span class='hs-varid'>fields</span><span class='hs-layout'>)</span>
<a name="line-83"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>new_fields</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>rnConDeclFields</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>fields</span>
<a name="line-84"></a>		<span class='hs-comment'>-- No need to check for duplicate fields</span>
<a name="line-85"></a>		<span class='hs-comment'>-- since that is done by RnNames.extendGlobalRdrEnvRn</span>
<a name="line-86"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCon</span> <span class='hs-varid'>new_fields</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-87"></a>
<a name="line-88"></a><a name="rnFamily"></a><span class='hs-comment'>-- Rename family declarations</span>
<a name="line-89"></a><span class='hs-comment'>--</span>
<a name="line-90"></a><span class='hs-comment'>-- * This function is parametrised by the routine handling the index</span>
<a name="line-91"></a><span class='hs-comment'>--   variables.  On the toplevel, these are defining occurences, whereas they</span>
<a name="line-92"></a><span class='hs-comment'>--   are usage occurences for associated types.</span>
<a name="line-93"></a><span class='hs-comment'>--</span>
<a name="line-94"></a><span class='hs-definition'>rnFamily</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyClDecl</span> <span class='hs-conid'>RdrName</span> 
<a name="line-95"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsTyVarBndr</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> 
<a name="line-96"></a>	     <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsTyVarBndr</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyClDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-97"></a>	     <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyClDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-98"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyClDecl</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-99"></a>
<a name="line-100"></a><span class='hs-definition'>rnFamily</span> <span class='hs-layout'>(</span><span class='hs-varid'>tydecl</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>TyFamily</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdFlavour</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flavour</span><span class='hs-layout'>,</span> 
<a name="line-101"></a>			   <span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-102"></a>        <span class='hs-varid'>bindIdxVars</span> <span class='hs-keyglyph'>=</span>
<a name="line-103"></a>      <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>bindIdxVars</span> <span class='hs-varid'>tyvars</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>tyvars'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>
<a name="line-104"></a>	 <span class='hs-layout'>;</span> <span class='hs-varid'>tycon'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span> <span class='hs-varid'>tycon</span>
<a name="line-105"></a>	 <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyFamily</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdFlavour</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flavour</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tycon'</span><span class='hs-layout'>,</span> 
<a name="line-106"></a>			      <span class='hs-varid'>tcdTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyvars'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdKind</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcdKind</span> <span class='hs-varid'>tydecl</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
<a name="line-107"></a>		    <span class='hs-varid'>emptyFVs</span><span class='hs-layout'>)</span> 
<a name="line-108"></a>         <span class='hs-layout'>}</span> <span class='hs-layout'>}</span>
<a name="line-109"></a><span class='hs-definition'>rnFamily</span> <span class='hs-varid'>d</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"rnFamily"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-110"></a>
<a name="line-111"></a><a name="rnATs"></a><span class='hs-comment'>-- Rename associated type declarations (in classes)</span>
<a name="line-112"></a><span class='hs-comment'>--</span>
<a name="line-113"></a><span class='hs-comment'>-- * This can be family declarations and (default) type instances</span>
<a name="line-114"></a><span class='hs-comment'>--</span>
<a name="line-115"></a><span class='hs-definition'>rnATs</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LTyClDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>LTyClDecl</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>FreeVars</span><span class='hs-layout'>)</span>
<a name="line-116"></a><span class='hs-definition'>rnATs</span> <span class='hs-varid'>ats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapFvRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrapLocFstM</span> <span class='hs-varid'>rn_at</span><span class='hs-layout'>)</span> <span class='hs-varid'>ats</span>
<a name="line-117"></a>  <span class='hs-keyword'>where</span>
<a name="line-118"></a>    <span class='hs-varid'>rn_at</span> <span class='hs-layout'>(</span><span class='hs-varid'>tydecl</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>TyFamily</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnFamily</span> <span class='hs-varid'>tydecl</span> <span class='hs-varid'>lookupIdxVars</span>
<a name="line-119"></a>    <span class='hs-varid'>rn_at</span> <span class='hs-layout'>(</span><span class='hs-varid'>tydecl</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>TySynonym</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> 
<a name="line-120"></a>      <span class='hs-keyword'>do</span>
<a name="line-121"></a>        <span class='hs-varid'>unless</span> <span class='hs-layout'>(</span><span class='hs-varid'>isNothing</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcdTyPats</span> <span class='hs-varid'>tydecl</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>addErr</span> <span class='hs-varid'>noPatterns</span>
<a name="line-122"></a>        <span class='hs-varid'>rnTyClDecl</span> <span class='hs-varid'>tydecl</span>
<a name="line-123"></a>    <span class='hs-varid'>rn_at</span> <span class='hs-keyword'>_</span>                      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"RnSource.rnATs: invalid TyClDecl"</span>
<a name="line-124"></a>
<a name="line-125"></a>    <span class='hs-varid'>lookupIdxVars</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>cont</span> <span class='hs-keyglyph'>=</span> 
<a name="line-126"></a>      <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>checkForDups</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>;</span>
<a name="line-127"></a>	 <span class='hs-layout'>;</span> <span class='hs-varid'>tyvars'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>lookupIdxVar</span> <span class='hs-varid'>tyvars</span>
<a name="line-128"></a>	 <span class='hs-layout'>;</span> <span class='hs-varid'>cont</span> <span class='hs-varid'>tyvars'</span>
<a name="line-129"></a>	 <span class='hs-layout'>}</span>
<a name="line-130"></a>    <span class='hs-comment'>-- Type index variables must be class parameters, which are the only</span>
<a name="line-131"></a>    <span class='hs-comment'>-- type variables in scope at this point.</span>
<a name="line-132"></a>    <span class='hs-varid'>lookupIdxVar</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>l</span> <span class='hs-varid'>tyvar</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-133"></a>      <span class='hs-keyword'>do</span>
<a name="line-134"></a>	<span class='hs-varid'>name'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupOccRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsTyVarName</span> <span class='hs-varid'>tyvar</span><span class='hs-layout'>)</span>
<a name="line-135"></a>	<span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>L</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>replaceTyVarName</span> <span class='hs-varid'>tyvar</span> <span class='hs-varid'>name'</span><span class='hs-layout'>)</span>
<a name="line-136"></a>
<a name="line-137"></a>    <span class='hs-comment'>-- Type variable may only occur once.</span>
<a name="line-138"></a>    <span class='hs-comment'>--</span>
<a name="line-139"></a>    <span class='hs-varid'>checkForDups</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-140"></a>    <span class='hs-varid'>checkForDups</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>tv</span><span class='hs-conop'>:</span><span class='hs-varid'>ltvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> 
<a name="line-141"></a>      <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>loc</span> <span class='hs-varop'>$</span>
<a name="line-142"></a>	     <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsTyVarName</span> <span class='hs-varid'>tv</span> <span class='hs-varop'>`ltvElem`</span> <span class='hs-varid'>ltvs</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-143"></a>	       <span class='hs-varid'>addErr</span> <span class='hs-layout'>(</span><span class='hs-varid'>repeatedTyVar</span> <span class='hs-varid'>tv</span><span class='hs-layout'>)</span>
<a name="line-144"></a>	 <span class='hs-layout'>;</span> <span class='hs-varid'>checkForDups</span> <span class='hs-varid'>ltvs</span>
<a name="line-145"></a>	 <span class='hs-layout'>}</span>
<a name="line-146"></a>
<a name="line-147"></a>    <span class='hs-keyword'>_</span>       <span class='hs-varop'>`ltvElem`</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-148"></a>    <span class='hs-varid'>rdrName</span> <span class='hs-varop'>`ltvElem`</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>tv</span><span class='hs-conop'>:</span><span class='hs-varid'>ltvs</span><span class='hs-layout'>)</span>
<a name="line-149"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>rdrName</span> <span class='hs-varop'>==</span> <span class='hs-varid'>hsTyVarName</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-150"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>		  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rdrName</span> <span class='hs-varop'>`ltvElem`</span> <span class='hs-varid'>ltvs</span>
<a name="line-151"></a>
<a name="line-152"></a><a name="deprecRecSyntax"></a><span class='hs-definition'>deprecRecSyntax</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ConDecl</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-153"></a><span class='hs-definition'>deprecRecSyntax</span> <span class='hs-varid'>decl</span> 
<a name="line-154"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Declaration of"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>con_name</span> <span class='hs-varid'>decl</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-155"></a>    	 	 <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"uses deprecated syntax"</span><span class='hs-layout'>)</span>
<a name="line-156"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Instead, use the form"</span><span class='hs-layout'>)</span>
<a name="line-157"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>decl</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>	 <span class='hs-comment'>-- Pretty printer uses new form</span>
<a name="line-158"></a>
<a name="line-159"></a><a name="badRecResTy"></a><span class='hs-definition'>badRecResTy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-160"></a><span class='hs-definition'>badRecResTy</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Malformed constructor signature"</span><span class='hs-layout'>)</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>doc</span>
<a name="line-161"></a>
<a name="line-162"></a><a name="noPatterns"></a><span class='hs-definition'>noPatterns</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>
<a name="line-163"></a><span class='hs-definition'>noPatterns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Default definition for an associated synonym cannot have"</span>
<a name="line-164"></a>	     <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"type pattern"</span>
<a name="line-165"></a>
<a name="line-166"></a><a name="repeatedTyVar"></a><span class='hs-definition'>repeatedTyVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsTyVarBndr</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-167"></a><span class='hs-definition'>repeatedTyVar</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Illegal repeated type variable"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span>
<a name="line-168"></a>		   <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>tv</span><span class='hs-layout'>)</span>
<a name="line-169"></a>
<a name="line-170"></a><span class='hs-comment'>-- This data decl will parse OK</span>
<a name="line-171"></a><span class='hs-comment'>--	data T = a Int</span>
<a name="line-172"></a><span class='hs-comment'>-- treating "a" as the constructor.</span>
<a name="line-173"></a><span class='hs-comment'>-- It is really hard to make the parser spot this malformation.</span>
<a name="line-174"></a><span class='hs-comment'>-- So the renamer has to check that the constructor is legal</span>
<a name="line-175"></a><span class='hs-comment'>--</span>
<a name="line-176"></a><span class='hs-comment'>-- We can get an operator as the constructor, even in the prefix form:</span>
<a name="line-177"></a><span class='hs-comment'>--	data T = :% Int Int</span>
<a name="line-178"></a><span class='hs-comment'>-- from interface files, which always print in prefix form</span>
<a name="line-179"></a>
<a name="line-180"></a><a name="checkConName"></a><span class='hs-definition'>checkConName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-conid'>()</span>
<a name="line-181"></a><span class='hs-definition'>checkConName</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>checkErr</span> <span class='hs-layout'>(</span><span class='hs-varid'>isRdrDataCon</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>badDataCon</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-182"></a>
<a name="line-183"></a><a name="badDataCon"></a><span class='hs-definition'>badDataCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-184"></a><span class='hs-definition'>badDataCon</span> <span class='hs-varid'>name</span>
<a name="line-185"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Illegal data constructor name"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}


%*********************************************************
%*							*
\subsection{Support code for type/data declarations}
%*							*
%*********************************************************

Get the mapping from constructors to fields for this module.
It's convenient to do this after the data type decls have been renamed
\begin{code}
<pre><a name="line-1"></a><a name="extendRecordFieldEnv"></a><span class='hs-definition'>extendRecordFieldEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LTyClDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LInstDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TcGblEnv</span>
<a name="line-2"></a><span class='hs-definition'>extendRecordFieldEnv</span> <span class='hs-varid'>tycl_decls</span> <span class='hs-varid'>inst_decls</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>tcg_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getGblEnv</span>
<a name="line-4"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>field_env'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>foldrM</span> <span class='hs-varid'>get_con</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcg_field_env</span> <span class='hs-varid'>tcg_env</span><span class='hs-layout'>)</span> <span class='hs-varid'>all_data_cons</span>
<a name="line-5"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcg_env</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tcg_field_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>field_env'</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-6"></a>  <span class='hs-keyword'>where</span>
<a name="line-7"></a>    <span class='hs-comment'>-- we want to lookup:</span>
<a name="line-8"></a>    <span class='hs-comment'>--  (a) a datatype constructor</span>
<a name="line-9"></a>    <span class='hs-comment'>--  (b) a record field</span>
<a name="line-10"></a>    <span class='hs-comment'>-- knowing that they're from this module.</span>
<a name="line-11"></a>    <span class='hs-comment'>-- lookupLocatedTopBndrRn does this, because it does a lookupGreLocalRn,</span>
<a name="line-12"></a>    <span class='hs-comment'>-- which keeps only the local ones.</span>
<a name="line-13"></a>    <span class='hs-varid'>lookup</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupLocatedTopBndrRn</span> <span class='hs-varid'>x</span>
<a name="line-14"></a>                    <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>x'</span><span class='hs-layout'>}</span>
<a name="line-15"></a>
<a name="line-16"></a>    <span class='hs-varid'>all_data_cons</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ConDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span>
<a name="line-17"></a>    <span class='hs-varid'>all_data_cons</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>con</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyData</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tcdCons</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cons</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>all_tycl_decls</span>
<a name="line-18"></a>    		         <span class='hs-layout'>,</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>cons</span> <span class='hs-keyglyph'>]</span>
<a name="line-19"></a>    <span class='hs-varid'>all_tycl_decls</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>at_tycl_decls</span> <span class='hs-varop'>++</span> <span class='hs-varid'>tycl_decls</span>
<a name="line-20"></a>    <span class='hs-varid'>at_tycl_decls</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>at</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstDecl</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ats</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>inst_decls</span><span class='hs-layout'>,</span> <span class='hs-varid'>at</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ats</span><span class='hs-keyglyph'>]</span>
<a name="line-21"></a>    		      <span class='hs-comment'>-- Do not forget associated types!</span>
<a name="line-22"></a>
<a name="line-23"></a>    <span class='hs-varid'>get_con</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConDecl</span> <span class='hs-layout'>{</span> <span class='hs-varid'>con_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>con</span><span class='hs-layout'>,</span> <span class='hs-varid'>con_details</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RecCon</span> <span class='hs-varid'>flds</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-24"></a>	    <span class='hs-layout'>(</span><span class='hs-conid'>RecFields</span> <span class='hs-varid'>env</span> <span class='hs-varid'>fld_set</span><span class='hs-layout'>)</span>
<a name="line-25"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>con'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookup</span> <span class='hs-varid'>con</span>
<a name="line-26"></a>             <span class='hs-layout'>;</span> <span class='hs-varid'>flds'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>lookup</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>cd_fld_name</span> <span class='hs-varid'>flds</span><span class='hs-layout'>)</span>
<a name="line-27"></a>	     <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>env'</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extendNameEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>con'</span> <span class='hs-varid'>flds'</span>
<a name="line-28"></a>	           <span class='hs-varid'>fld_set'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addListToNameSet</span> <span class='hs-varid'>fld_set</span> <span class='hs-varid'>flds'</span>
<a name="line-29"></a>             <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecFields</span> <span class='hs-varid'>env'</span> <span class='hs-varid'>fld_set'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-30"></a>    <span class='hs-varid'>get_con</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>env</span>
</pre>\end{code}

%*********************************************************
%*							*
\subsection{Support code to rename types}
%*							*
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="rnFds"></a><span class='hs-definition'>rnFds</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Located</span> <span class='hs-layout'>(</span><span class='hs-conid'>FunDep</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Located</span> <span class='hs-layout'>(</span><span class='hs-conid'>FunDep</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-definition'>rnFds</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>fds</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrapLocM</span> <span class='hs-varid'>rn_fds</span><span class='hs-layout'>)</span> <span class='hs-varid'>fds</span>
<a name="line-5"></a>  <span class='hs-keyword'>where</span>
<a name="line-6"></a>    <span class='hs-varid'>rn_fds</span> <span class='hs-layout'>(</span><span class='hs-varid'>tys1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tys2</span><span class='hs-layout'>)</span>
<a name="line-7"></a>      <span class='hs-keyglyph'>=</span>	<span class='hs-varid'>rnHsTyVars</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>tys1</span>		<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tys1'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-8"></a>	<span class='hs-varid'>rnHsTyVars</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>tys2</span>		<span class='hs-varop'>`thenM`</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tys2'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-9"></a>	<span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tys1'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tys2'</span><span class='hs-layout'>)</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="rnHsTyVars"></a><span class='hs-definition'>rnHsTyVars</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-12"></a><span class='hs-definition'>rnHsTyVars</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>tvs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>rnHsTyVar</span> <span class='hs-varid'>doc</span><span class='hs-layout'>)</span> <span class='hs-varid'>tvs</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="rnHsTyVar"></a><span class='hs-definition'>rnHsTyVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RdrName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RnM</span> <span class='hs-conid'>Name</span>
<a name="line-15"></a><span class='hs-definition'>rnHsTyVar</span> <span class='hs-sel'>_doc</span> <span class='hs-varid'>tyvar</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupOccRn</span> <span class='hs-varid'>tyvar</span>
</pre>\end{code}


</body>
</html>