Sophie

Sophie

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

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>typecheck/TcClassDcl.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%

Typechecking class declarations

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>TcClassDcl</span> <span class='hs-layout'>(</span> <span class='hs-varid'>tcClassSigs</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcClassDecl2</span><span class='hs-layout'>,</span> 
<a name="line-2"></a>		    <span class='hs-varid'>findMethodBind</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcInstanceMethodBody</span><span class='hs-layout'>,</span> 
<a name="line-3"></a>		    <span class='hs-varid'>mkGenericDefMethBind</span><span class='hs-layout'>,</span> <span class='hs-varid'>getGenericInstances</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDefMethRdrName</span><span class='hs-layout'>,</span>
<a name="line-4"></a>		    <span class='hs-varid'>tcAddDeclCtxt</span><span class='hs-layout'>,</span> <span class='hs-varid'>badMethodErr</span><span class='hs-layout'>,</span> <span class='hs-varid'>badATErr</span><span class='hs-layout'>,</span> <span class='hs-varid'>omittedATWarn</span>
<a name="line-5"></a>		  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HsSyn</span>
<a name="line-10"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnHsSyn</span>
<a name="line-11"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnExpr</span>
<a name="line-12"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnEnv</span>
<a name="line-13"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Inst</span>
<a name="line-14"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>InstEnv</span>
<a name="line-15"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcEnv</span>
<a name="line-16"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcBinds</span>
<a name="line-17"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcSimplify</span>
<a name="line-18"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcHsType</span>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcMType</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcType</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcRnMonad</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Generics</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>MkId</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Id</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameEnv</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameSet</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RdrName</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DynFlags</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ErrUtils</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ListSetOps</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Maybes</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Bag</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-43"></a>
<a name="line-44"></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-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
</pre>\end{code}


Dictionary handling
~~~~~~~~~~~~~~~~~~~
Every class implicitly declares a new data type, corresponding to dictionaries
of that class. So, for example:

	class (D a) => C a where
	  op1 :: a -> a
	  op2 :: forall b. Ord b => a -> b -> b

would implicitly declare

	data CDict a = CDict (D a)	
			     (a -> a)
			     (forall b. Ord b => a -> b -> b)

(We could use a record decl, but that means changing more of the existing apparatus.
One step at at time!)

For classes with just one superclass+method, we use a newtype decl instead:

	class C a where
	  op :: forallb. a -> b -> b

generates

	newtype CDict a = CDict (forall b. a -> b -> b)

Now DictTy in Type is just a form of type synomym: 
	DictTy c t = TyConTy CDict `AppTy` t

Death to "ExpandingDicts".


%************************************************************************
%*									*
		Type-checking the class op signatures
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcClassSigs"></a><span class='hs-definition'>tcClassSigs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span>	    		<span class='hs-comment'>-- Name of the class</span>
<a name="line-2"></a>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LSig</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-3"></a>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span>
<a name="line-4"></a>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcMethInfo</span><span class='hs-keyglyph'>]</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="TcMethInfo"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>TcMethInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>DefMeth</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- A temporary intermediate, to communicate </span>
<a name="line-7"></a>					<span class='hs-comment'>-- between tcClassSigs and buildClass</span>
<a name="line-8"></a><span class='hs-definition'>tcClassSigs</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>sigs</span> <span class='hs-varid'>def_methods</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>dm_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>checkDefaultBinds</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>op_names</span> <span class='hs-varid'>def_methods</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'>tcClassSig</span> <span class='hs-varid'>dm_env</span><span class='hs-layout'>)</span> <span class='hs-varid'>op_sigs</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'>op_sigs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>sig</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>sig</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</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-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</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-13"></a>    <span class='hs-varid'>op_names</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>n</span>   <span class='hs-keyglyph'>|</span>     <span class='hs-layout'>(</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-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>op_sigs</span><span class='hs-keyglyph'>]</span>
<a name="line-14"></a>
<a name="line-15"></a>
<a name="line-16"></a><a name="checkDefaultBinds"></a><span class='hs-definition'>checkDefaultBinds</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</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'>LHsBinds</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>NameEnv</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>
<a name="line-17"></a>  <span class='hs-comment'>-- Check default bindings</span>
<a name="line-18"></a>  <span class='hs-comment'>-- 	a) must be for a class op for this class</span>
<a name="line-19"></a>  <span class='hs-comment'>--	b) must be all generic or all non-generic</span>
<a name="line-20"></a>  <span class='hs-comment'>-- and return a mapping from class-op to Bool</span>
<a name="line-21"></a>  <span class='hs-comment'>--	where True &lt;=&gt; it's a generic default method</span>
<a name="line-22"></a><span class='hs-definition'>checkDefaultBinds</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>ops</span> <span class='hs-varid'>binds</span>
<a name="line-23"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>dm_infos</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-layout'>(</span><span class='hs-varid'>checkDefaultBind</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>ops</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>bagToList</span> <span class='hs-varid'>binds</span><span class='hs-layout'>)</span>
<a name="line-24"></a>       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkNameEnv</span> <span class='hs-varid'>dm_infos</span><span class='hs-layout'>)</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="checkDefaultBind"></a><span class='hs-definition'>checkDefaultBind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</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'>HsBindLR</span> <span class='hs-conid'>Name</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>
<a name="line-27"></a><span class='hs-definition'>checkDefaultBind</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>ops</span> <span class='hs-layout'>(</span><span class='hs-conid'>FunBind</span> <span class='hs-layout'>{</span><span class='hs-varid'>fun_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>op</span><span class='hs-layout'>,</span> <span class='hs-varid'>fun_matches</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MatchGroup</span> <span class='hs-varid'>matches</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-28"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>  	<span class='hs-comment'>-- Check that the op is from this class</span>
<a name="line-29"></a>	<span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>op</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>ops</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>badMethodErr</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>op</span><span class='hs-layout'>)</span>
<a name="line-30"></a>
<a name="line-31"></a>   	<span class='hs-comment'>-- Check that all the defns ar generic, or none are</span>
<a name="line-32"></a>    <span class='hs-layout'>;</span>	<span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>all_generic</span> <span class='hs-varop'>||</span> <span class='hs-varid'>none_generic</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mixedGenericErr</span> <span class='hs-varid'>op</span><span class='hs-layout'>)</span>
<a name="line-33"></a>
<a name="line-34"></a>    <span class='hs-layout'>;</span>	<span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>op</span><span class='hs-layout'>,</span> <span class='hs-varid'>all_generic</span><span class='hs-layout'>)</span>
<a name="line-35"></a>    <span class='hs-layout'>}</span>
<a name="line-36"></a>  <span class='hs-keyword'>where</span>
<a name="line-37"></a>    <span class='hs-varid'>n_generic</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>count</span> <span class='hs-layout'>(</span><span class='hs-varid'>isJust</span> <span class='hs-varop'>.</span> <span class='hs-varid'>maybeGenericMatch</span><span class='hs-layout'>)</span> <span class='hs-varid'>matches</span>
<a name="line-38"></a>    <span class='hs-varid'>none_generic</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n_generic</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-39"></a>    <span class='hs-varid'>all_generic</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>matches</span> <span class='hs-varop'>`lengthIs`</span> <span class='hs-varid'>n_generic</span>
<a name="line-40"></a><span class='hs-definition'>checkDefaultBind</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"checkDefaultBind"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-41"></a>
<a name="line-42"></a>
<a name="line-43"></a><a name="tcClassSig"></a><span class='hs-definition'>tcClassSig</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameEnv</span> <span class='hs-conid'>Bool</span>		<span class='hs-comment'>-- Info about default methods; </span>
<a name="line-44"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LSig</span> <span class='hs-conid'>Name</span>
<a name="line-45"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TcMethInfo</span>
<a name="line-46"></a>
<a name="line-47"></a><span class='hs-definition'>tcClassSig</span> <span class='hs-varid'>dm_env</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'>TypeSig</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>op_name</span><span class='hs-layout'>)</span> <span class='hs-varid'>op_hs_ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-48"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>loc</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-49"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>op_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcHsKindedType</span> <span class='hs-varid'>op_hs_ty</span>	<span class='hs-comment'>-- Class tyvars already in scope</span>
<a name="line-50"></a>    <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>dm</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupNameEnv</span> <span class='hs-varid'>dm_env</span> <span class='hs-varid'>op_name</span> <span class='hs-keyword'>of</span>
<a name="line-51"></a>		<span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NoDefMeth</span>
<a name="line-52"></a>		<span class='hs-conid'>Just</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DefMeth</span>
<a name="line-53"></a>		<span class='hs-conid'>Just</span> <span class='hs-conid'>True</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>GenDefMeth</span>
<a name="line-54"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>op_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>dm</span><span class='hs-layout'>,</span> <span class='hs-varid'>op_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-55"></a><span class='hs-definition'>tcClassSig</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tcClassSig"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
		Class Declarations
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcClassDecl2"></a><span class='hs-definition'>tcClassDecl2</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LTyClDecl</span> <span class='hs-conid'>Name</span>		<span class='hs-comment'>-- The class declaration</span>
<a name="line-2"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-definition'>tcClassDecl2</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'>ClassDecl</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>class_name</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-5"></a>				<span class='hs-varid'>tcdMeths</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>default_binds</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>recoverM</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>emptyLHsBinds</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>	<span class='hs-varop'>$</span>
<a name="line-7"></a>    <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>loc</span>		   		<span class='hs-varop'>$</span>
<a name="line-8"></a>    <span class='hs-keyword'>do</span>  <span class='hs-layout'>{</span> <span class='hs-varid'>clas</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupLocatedClass</span> <span class='hs-varid'>class_name</span>
<a name="line-9"></a>
<a name="line-10"></a>	<span class='hs-comment'>-- We make a separate binding for each default method.</span>
<a name="line-11"></a>	<span class='hs-comment'>-- At one time I used a single AbsBinds for all of them, thus</span>
<a name="line-12"></a>	<span class='hs-comment'>-- AbsBind [d] [dm1, dm2, dm3] { dm1 = ...; dm2 = ...; dm3 = ... }</span>
<a name="line-13"></a>	<span class='hs-comment'>-- But that desugars into</span>
<a name="line-14"></a>	<span class='hs-comment'>--	ds = \d -&gt; (..., ..., ...)</span>
<a name="line-15"></a>	<span class='hs-comment'>--	dm1 = \d -&gt; case ds d of (a,b,c) -&gt; a</span>
<a name="line-16"></a>	<span class='hs-comment'>-- And since ds is big, it doesn't get inlined, so we don't get good</span>
<a name="line-17"></a>	<span class='hs-comment'>-- default methods.  Better to make separate AbsBinds for each</span>
<a name="line-18"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span>
<a name="line-19"></a>	      <span class='hs-layout'>(</span><span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>op_items</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>classBigSig</span> <span class='hs-varid'>clas</span>
<a name="line-20"></a>	      <span class='hs-varid'>rigid_info</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ClsSkol</span> <span class='hs-varid'>clas</span>
<a name="line-21"></a>	      <span class='hs-varid'>prag_fn</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPragFun</span> <span class='hs-varid'>sigs</span>
<a name="line-22"></a>	      <span class='hs-varid'>sig_fn</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTcSigFun</span> <span class='hs-varid'>sigs</span>
<a name="line-23"></a>	      <span class='hs-varid'>clas_tyvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSkolSigTyVars</span> <span class='hs-varid'>rigid_info</span> <span class='hs-varid'>tyvars</span>
<a name="line-24"></a>	      <span class='hs-varid'>pred</span>  	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkClassPred</span> <span class='hs-varid'>clas</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVarTys</span> <span class='hs-varid'>clas_tyvars</span><span class='hs-layout'>)</span>
<a name="line-25"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>inst_loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-layout'>(</span><span class='hs-conid'>SigOrigin</span> <span class='hs-varid'>rigid_info</span><span class='hs-layout'>)</span>
<a name="line-26"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>this_dict</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newDictBndr</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span>
<a name="line-27"></a>
<a name="line-28"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>tc_dm</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcDefMeth</span> <span class='hs-varid'>rigid_info</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>clas_tyvars</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>pred</span><span class='hs-keyglyph'>]</span> 
<a name="line-29"></a>				<span class='hs-varid'>this_dict</span> <span class='hs-varid'>default_binds</span>
<a name="line-30"></a>	      			<span class='hs-varid'>sig_fn</span> <span class='hs-varid'>prag_fn</span>
<a name="line-31"></a>	      	<span class='hs-comment'>-- tc_dm is called only for a sel_id</span>
<a name="line-32"></a>	      	<span class='hs-comment'>-- that has a binding in default_binds</span>
<a name="line-33"></a>
<a name="line-34"></a>	      <span class='hs-varid'>dm_sel_ids</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>sel_id</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>sel_id</span><span class='hs-layout'>,</span> <span class='hs-conid'>DefMeth</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>op_items</span><span class='hs-keyglyph'>]</span>
<a name="line-35"></a>	      <span class='hs-comment'>-- Generate code for polymorphic default methods only (hence DefMeth)</span>
<a name="line-36"></a>	      <span class='hs-comment'>-- (Generic default methods have turned into instance decls by now.)</span>
<a name="line-37"></a>	      <span class='hs-comment'>-- This is incompatible with Hugs, which expects a polymorphic </span>
<a name="line-38"></a>	      <span class='hs-comment'>-- default method for every class op, regardless of whether or not </span>
<a name="line-39"></a>	      <span class='hs-comment'>-- the programmer supplied an explicit default decl for the class.  </span>
<a name="line-40"></a>	      <span class='hs-comment'>-- (If necessary we can fix that, but we don't have a convenient Id to hand.)</span>
<a name="line-41"></a>
<a name="line-42"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>defm_binds</span><span class='hs-layout'>,</span> <span class='hs-varid'>dm_ids</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcExtendTyVarEnv</span> <span class='hs-varid'>clas_tyvars</span>  <span class='hs-varop'>$</span>
<a name="line-43"></a>			          <span class='hs-varid'>mapAndUnzipM</span> <span class='hs-varid'>tc_dm</span> <span class='hs-varid'>dm_sel_ids</span>
<a name="line-44"></a>
<a name="line-45"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>unionManyBags</span> <span class='hs-varid'>defm_binds</span><span class='hs-layout'>,</span> <span class='hs-varid'>dm_ids</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-46"></a>
<a name="line-47"></a><span class='hs-definition'>tcClassDecl2</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tcClassDecl2"</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-48"></a>    
<a name="line-49"></a><a name="tcDefMeth"></a><span class='hs-definition'>tcDefMeth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SkolemInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Class</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ThetaType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span>
<a name="line-50"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcSigFun</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcPragFun</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-51"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>Id</span><span class='hs-layout'>)</span>
<a name="line-52"></a><span class='hs-definition'>tcDefMeth</span> <span class='hs-varid'>rigid_info</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>theta</span> <span class='hs-varid'>this_dict</span> <span class='hs-varid'>binds_in</span> <span class='hs-varid'>sig_fn</span> <span class='hs-varid'>prag_fn</span> <span class='hs-varid'>sel_id</span>
<a name="line-53"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>sel_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idName</span> <span class='hs-varid'>sel_id</span>
<a name="line-54"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>local_dm_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newLocalName</span> <span class='hs-varid'>sel_name</span>
<a name="line-55"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>meth_bind</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findMethodBind</span> <span class='hs-varid'>sel_name</span> <span class='hs-varid'>local_dm_name</span> <span class='hs-varid'>binds_in</span>
<a name="line-56"></a>			  <span class='hs-varop'>`orElse`</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tcDefMeth"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>sel_id</span><span class='hs-layout'>)</span>
<a name="line-57"></a>		<span class='hs-comment'>-- We only call tcDefMeth on selectors for which </span>
<a name="line-58"></a>		<span class='hs-comment'>-- there is a binding in binds_in</span>
<a name="line-59"></a>
<a name="line-60"></a>	      <span class='hs-varid'>meth_sig_fn</span>  <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sig_fn</span> <span class='hs-varid'>sel_name</span>
<a name="line-61"></a>	      <span class='hs-varid'>meth_prag_fn</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>prag_fn</span> <span class='hs-varid'>sel_name</span>
<a name="line-62"></a>
<a name="line-63"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>top_dm_id</span><span class='hs-layout'>,</span> <span class='hs-varid'>bind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcInstanceMethodBody</span> <span class='hs-varid'>rigid_info</span>
<a name="line-64"></a>			   <span class='hs-varid'>clas</span> <span class='hs-varid'>tyvars</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>this_dict</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>theta</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVarTys</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>)</span>
<a name="line-65"></a>			   <span class='hs-conid'>Nothing</span> <span class='hs-varid'>sel_id</span>
<a name="line-66"></a>			   <span class='hs-varid'>local_dm_name</span>
<a name="line-67"></a>			   <span class='hs-varid'>meth_sig_fn</span> <span class='hs-varid'>meth_prag_fn</span>
<a name="line-68"></a>			   <span class='hs-varid'>meth_bind</span>
<a name="line-69"></a>
<a name="line-70"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>bind</span><span class='hs-layout'>,</span> <span class='hs-varid'>top_dm_id</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-71"></a>
<a name="line-72"></a><a name="mkDefMethRdrName"></a><span class='hs-definition'>mkDefMethRdrName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RdrName</span>
<a name="line-73"></a><span class='hs-definition'>mkDefMethRdrName</span> <span class='hs-varid'>sel_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkDerivedRdrName</span> <span class='hs-varid'>sel_name</span> <span class='hs-varid'>mkDefaultMethodOcc</span>
<a name="line-74"></a>
<a name="line-75"></a><a name="findMethodBind"></a><span class='hs-comment'>---------------------------</span>
<a name="line-76"></a><span class='hs-comment'>-- The renamer just puts the selector ID as the binder in the method binding</span>
<a name="line-77"></a><span class='hs-comment'>-- but we must use the method name; so we substitute it here.  Crude but simple.</span>
<a name="line-78"></a><span class='hs-definition'>findMethodBind</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> 	<span class='hs-comment'>-- Selector and method name</span>
<a name="line-79"></a>          	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span> 	<span class='hs-comment'>-- A group of bindings</span>
<a name="line-80"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</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-comment'>-- The binding, with meth_name replacing sel_name</span>
<a name="line-81"></a><span class='hs-definition'>findMethodBind</span> <span class='hs-varid'>sel_name</span> <span class='hs-varid'>meth_name</span> <span class='hs-varid'>binds</span>
<a name="line-82"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldlBag</span> <span class='hs-varid'>mplus</span> <span class='hs-conid'>Nothing</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapBag</span> <span class='hs-varid'>f</span> <span class='hs-varid'>binds</span><span class='hs-layout'>)</span>
<a name="line-83"></a>  <span class='hs-keyword'>where</span> 
<a name="line-84"></a>	<span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc1</span> <span class='hs-varid'>bind</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FunBind</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fun_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varid'>loc2</span> <span class='hs-varid'>op_name</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-85"></a>	         <span class='hs-keyglyph'>|</span> <span class='hs-varid'>op_name</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sel_name</span>
<a name="line-86"></a>		 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc1</span> <span class='hs-layout'>(</span><span class='hs-varid'>bind</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fun_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varid'>loc2</span> <span class='hs-varid'>meth_name</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-87"></a>	<span class='hs-varid'>f</span> <span class='hs-sel'>_other</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-88"></a>
<a name="line-89"></a><a name="tcInstanceMethodBody"></a><span class='hs-comment'>---------------</span>
<a name="line-90"></a><span class='hs-definition'>tcInstanceMethodBody</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SkolemInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Class</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcTyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span>
<a name="line-91"></a>	 	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcType</span><span class='hs-keyglyph'>]</span>
<a name="line-92"></a>		     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Inst</span><span class='hs-layout'>,</span> <span class='hs-conid'>LHsBind</span> <span class='hs-conid'>Id</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-93"></a>		     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span>		<span class='hs-comment'>-- The local method name</span>
<a name="line-94"></a>          	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcSigFun</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcPragFun</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsBind</span> <span class='hs-conid'>Name</span> 
<a name="line-95"></a>          	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Id</span><span class='hs-layout'>)</span>
<a name="line-96"></a><span class='hs-definition'>tcInstanceMethodBody</span> <span class='hs-varid'>rigid_info</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>dfun_dicts</span> <span class='hs-varid'>theta</span> <span class='hs-varid'>inst_tys</span>
<a name="line-97"></a>		     <span class='hs-varid'>mb_this_bind</span> <span class='hs-varid'>sel_id</span>  <span class='hs-varid'>local_meth_name</span>
<a name="line-98"></a>		     <span class='hs-varid'>sig_fn</span> <span class='hs-varid'>prag_fn</span> <span class='hs-varid'>bind</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-keyword'>_</span><span class='hs-layout'>)</span>
<a name="line-99"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>sel_tyvars</span><span class='hs-layout'>,</span><span class='hs-varid'>sel_rho</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitForAllTys</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>sel_id</span><span class='hs-layout'>)</span>
<a name="line-100"></a>	      <span class='hs-varid'>rho_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>length</span> <span class='hs-varid'>sel_tyvars</span> <span class='hs-varop'>==</span> <span class='hs-varid'>length</span> <span class='hs-varid'>inst_tys</span> <span class='hs-layout'>)</span>
<a name="line-101"></a>		       <span class='hs-varid'>substTyWith</span> <span class='hs-varid'>sel_tyvars</span> <span class='hs-varid'>inst_tys</span> <span class='hs-varid'>sel_rho</span>
<a name="line-102"></a>
<a name="line-103"></a>	      <span class='hs-layout'>(</span><span class='hs-varid'>first_pred</span><span class='hs-layout'>,</span> <span class='hs-varid'>local_meth_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitPredFunTy_maybe</span> <span class='hs-varid'>rho_ty</span>
<a name="line-104"></a>			<span class='hs-varop'>`orElse`</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tcInstanceMethod"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>sel_id</span><span class='hs-layout'>)</span>
<a name="line-105"></a>
<a name="line-106"></a>	      <span class='hs-varid'>local_meth_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>local_meth_name</span> <span class='hs-varid'>local_meth_ty</span>
<a name="line-107"></a>	      <span class='hs-varid'>meth_ty</span> 	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSigmaTy</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>theta</span> <span class='hs-varid'>local_meth_ty</span>
<a name="line-108"></a>	      <span class='hs-varid'>sel_name</span>	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idName</span> <span class='hs-varid'>sel_id</span>
<a name="line-109"></a>
<a name="line-110"></a>		      <span class='hs-comment'>-- The first predicate should be of form (C a b)</span>
<a name="line-111"></a>		      <span class='hs-comment'>-- where C is the class in question</span>
<a name="line-112"></a>	<span class='hs-layout'>;</span> <span class='hs-conid'>MASSERT</span><span class='hs-layout'>(</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>getClassPredTys_maybe</span> <span class='hs-varid'>first_pred</span> <span class='hs-keyword'>of</span>
<a name="line-113"></a>			<span class='hs-layout'>{</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>clas1</span><span class='hs-layout'>,</span> <span class='hs-sel'>_tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>clas</span> <span class='hs-varop'>==</span> <span class='hs-varid'>clas1</span> <span class='hs-layout'>;</span> <span class='hs-conid'>Nothing</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-114"></a>
<a name="line-115"></a>		<span class='hs-comment'>-- Typecheck the binding, first extending the envt</span>
<a name="line-116"></a>		<span class='hs-comment'>-- so that when tcInstSig looks up the local_meth_id to find</span>
<a name="line-117"></a>		<span class='hs-comment'>-- its signature, we'll find it in the environment</span>
<a name="line-118"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>tc_bind</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>lie</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLIE</span> <span class='hs-varop'>$</span>
<a name="line-119"></a>		<span class='hs-varid'>tcExtendIdEnv</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>local_meth_id</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>$</span>
<a name="line-120"></a>	        <span class='hs-varid'>tcPolyBinds</span> <span class='hs-conid'>TopLevel</span> <span class='hs-varid'>sig_fn</span> <span class='hs-varid'>prag_fn</span> 
<a name="line-121"></a>			    <span class='hs-conid'>NonRecursive</span> <span class='hs-conid'>NonRecursive</span>
<a name="line-122"></a>			    <span class='hs-layout'>(</span><span class='hs-varid'>unitBag</span> <span class='hs-varid'>bind</span><span class='hs-layout'>)</span>
<a name="line-123"></a>
<a name="line-124"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>meth_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>rigid_info</span> <span class='hs-keyword'>of</span>
<a name="line-125"></a>		       <span class='hs-conid'>ClsSkol</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>dm_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupTopBndrRn</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkDefMethRdrName</span> <span class='hs-varid'>sel_name</span><span class='hs-layout'>)</span>
<a name="line-126"></a>				       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkDefaultMethodId</span> <span class='hs-varid'>dm_name</span> <span class='hs-varid'>meth_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-127"></a>		       <span class='hs-sel'>_other</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>meth_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newLocalName</span> <span class='hs-varid'>sel_name</span>
<a name="line-128"></a>				       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>meth_name</span> <span class='hs-varid'>meth_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-129"></a>    	
<a name="line-130"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>avails</span><span class='hs-layout'>,</span> <span class='hs-varid'>this_dict_bind</span><span class='hs-layout'>)</span> 
<a name="line-131"></a>		<span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_this_bind</span> <span class='hs-keyword'>of</span>
<a name="line-132"></a>		    <span class='hs-conid'>Nothing</span>	      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>dfun_dicts</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyBag</span><span class='hs-layout'>)</span>
<a name="line-133"></a>		    <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>this</span><span class='hs-layout'>,</span> <span class='hs-varid'>bind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>this</span> <span class='hs-conop'>:</span> <span class='hs-varid'>dfun_dicts</span><span class='hs-layout'>,</span> <span class='hs-varid'>unitBag</span> <span class='hs-varid'>bind</span><span class='hs-layout'>)</span>
<a name="line-134"></a>
<a name="line-135"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>inst_loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-layout'>(</span><span class='hs-conid'>SigOrigin</span> <span class='hs-varid'>rigid_info</span><span class='hs-layout'>)</span>
<a name="line-136"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>lie_binds</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcSimplifyCheck</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>avails</span> <span class='hs-varid'>lie</span>
<a name="line-137"></a>
<a name="line-138"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>full_bind</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varop'>$</span> 
<a name="line-139"></a>			  <span class='hs-conid'>AbsBinds</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>dfun_lam_vars</span>
<a name="line-140"></a>     				  <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> <span class='hs-varid'>meth_id</span><span class='hs-layout'>,</span> <span class='hs-varid'>local_meth_id</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-141"></a>				  <span class='hs-layout'>(</span><span class='hs-varid'>this_dict_bind</span> <span class='hs-varop'>`unionBags`</span> <span class='hs-varid'>lie_binds</span> 
<a name="line-142"></a>				   <span class='hs-varop'>`unionBags`</span> <span class='hs-varid'>tc_bind</span><span class='hs-layout'>)</span>
<a name="line-143"></a>
<a name="line-144"></a>	      <span class='hs-varid'>dfun_lam_vars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>instToVar</span> <span class='hs-varid'>dfun_dicts</span>	<span class='hs-comment'>-- Includes equalities</span>
<a name="line-145"></a>
<a name="line-146"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>meth_id</span><span class='hs-layout'>,</span> <span class='hs-varid'>unitBag</span> <span class='hs-varid'>full_bind</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span> 
</pre>\end{code}

Note [Polymorphic methods]
~~~~~~~~~~~~~~~~~~~~~~~~~~
Consider
    class Foo a where
	op :: forall b. Ord b => a -> b -> b -> b
    instance Foo c => Foo [c] where
        op = e

When typechecking the binding 'op = e', we'll have a meth_id for op
whose type is
      op :: forall c. Foo c => forall b. Ord b => [c] -> b -> b -> b

So tcPolyBinds must be capable of dealing with nested polytypes; 
and so it is. See TcBinds.tcMonoBinds (with type-sig case).

Note [Silly default-method bind]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When we pass the default method binding to the type checker, it must
look like    op2 = e
not  	     $dmop2 = e
otherwise the "$dm" stuff comes out error messages.  But we want the
"$dm" to come out in the interface file.  So we typecheck the former,
and wrap it in a let, thus
	  $dmop2 = let op2 = e in op2
This makes the error messages right.


%************************************************************************
%*									*
	Extracting generic instance declaration from class declarations
%*									*
%************************************************************************

@getGenericInstances@ extracts the generic instance declarations from a class
declaration.  For exmaple

	class C a where
	  op :: a -> a
	
	  op{ x+y } (Inl v)   = ...
	  op{ x+y } (Inr v)   = ...
	  op{ x*y } (v :*: w) = ...
	  op{ 1   } Unit      = ...

gives rise to the instance declarations

	instance C (x+y) where
	  op (Inl v)   = ...
	  op (Inr v)   = ...
	
	instance C (x*y) where
	  op (v :*: w) = ...

	instance C 1 where
	  op Unit      = ...


\begin{code}
<pre><a name="line-1"></a><a name="mkGenericDefMethBind"></a><span class='hs-definition'>mkGenericDefMethBind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Class</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsBind</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>mkGenericDefMethBind</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>inst_tys</span> <span class='hs-varid'>sel_id</span> <span class='hs-varid'>meth_name</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> 	<span class='hs-comment'>-- A generic default method</span>
<a name="line-4"></a>    	<span class='hs-comment'>-- If the method is defined generically, we can only do the job if the</span>
<a name="line-5"></a>	<span class='hs-comment'>-- instance declaration is for a single-parameter type class with</span>
<a name="line-6"></a>	<span class='hs-comment'>-- a type constructor applied to type arguments in the instance decl</span>
<a name="line-7"></a>	<span class='hs-comment'>-- 	(checkTc, so False provokes the error)</span>
<a name="line-8"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>isJust</span> <span class='hs-varid'>maybe_tycon</span><span class='hs-layout'>)</span>
<a name="line-9"></a>	 	  <span class='hs-layout'>(</span><span class='hs-varid'>badGenericInstance</span> <span class='hs-varid'>sel_id</span> <span class='hs-layout'>(</span><span class='hs-varid'>notSimple</span> <span class='hs-varid'>inst_tys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-10"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConHasGenerics</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span>
<a name="line-11"></a>	   	  <span class='hs-layout'>(</span><span class='hs-varid'>badGenericInstance</span> <span class='hs-varid'>sel_id</span> <span class='hs-layout'>(</span><span class='hs-varid'>notGeneric</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getDOpts</span>
<a name="line-14"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>dumpIfSet_dyn</span> <span class='hs-varid'>dflags</span> <span class='hs-conid'>Opt_D_dump_deriv</span> <span class='hs-str'>"Filling in method body"</span>
<a name="line-15"></a>		   <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>clas</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>inst_tys</span><span class='hs-layout'>,</span>
<a name="line-16"></a>			  <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'>sel_id</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>equals</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-17"></a>
<a name="line-18"></a>		<span class='hs-comment'>-- Rename it before returning it</span>
<a name="line-19"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>rn_rhs</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</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-20"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkFunBind</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-varid'>meth_name</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkSimpleMatch</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>rn_rhs</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-21"></a>  <span class='hs-keyword'>where</span>
<a name="line-22"></a>    <span class='hs-varid'>rhs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkGenericRhs</span> <span class='hs-varid'>sel_id</span> <span class='hs-varid'>clas_tyvar</span> <span class='hs-varid'>tycon</span>
<a name="line-23"></a>
<a name="line-24"></a>	  <span class='hs-comment'>-- The tycon is only used in the generic case, and in that</span>
<a name="line-25"></a>	  <span class='hs-comment'>-- case we require that the instance decl is for a single-parameter</span>
<a name="line-26"></a>	  <span class='hs-comment'>-- type class with type variable arguments:</span>
<a name="line-27"></a>	  <span class='hs-comment'>--	instance (...) =&gt; C (T a b)</span>
<a name="line-28"></a>    <span class='hs-varid'>clas_tyvar</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-layout'>(</span><span class='hs-varid'>classTyVars</span> <span class='hs-varid'>clas</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>head</span> <span class='hs-layout'>(</span><span class='hs-varid'>classTyVars</span> <span class='hs-varid'>clas</span><span class='hs-layout'>)</span>
<a name="line-29"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>tycon</span>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>maybe_tycon</span>
<a name="line-30"></a>    <span class='hs-varid'>maybe_tycon</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>inst_tys</span> <span class='hs-keyword'>of</span> 
<a name="line-31"></a>			<span class='hs-keyglyph'>[</span><span class='hs-varid'>ty</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>tcSplitTyConApp_maybe</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>of</span>
<a name="line-32"></a>				  <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>all</span> <span class='hs-varid'>tcIsTyVarTy</span> <span class='hs-varid'>arg_tys</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>tycon</span>
<a name="line-33"></a>				  <span class='hs-keyword'>_</span>    						  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-34"></a>			<span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-35"></a>
<a name="line-36"></a>
<a name="line-37"></a><a name="getGenericInstances"></a><span class='hs-comment'>---------------------------</span>
<a name="line-38"></a><span class='hs-definition'>getGenericInstances</span> <span class='hs-keyglyph'>::</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-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>InstInfo</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> 
<a name="line-39"></a><span class='hs-definition'>getGenericInstances</span> <span class='hs-varid'>class_decls</span>
<a name="line-40"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>gen_inst_infos</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'>get_generics</span><span class='hs-layout'>)</span> <span class='hs-varid'>class_decls</span>
<a name="line-41"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>{</span> <span class='hs-varid'>gen_inst_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concat</span> <span class='hs-varid'>gen_inst_infos</span> <span class='hs-layout'>}</span>
<a name="line-42"></a>
<a name="line-43"></a>	<span class='hs-comment'>-- Return right away if there is no generic stuff</span>
<a name="line-44"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>gen_inst_info</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-45"></a>	  <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> 
<a name="line-46"></a>
<a name="line-47"></a>	<span class='hs-comment'>-- Otherwise print it out</span>
<a name="line-48"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getDOpts</span>
<a name="line-49"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>dumpIfSet_dyn</span> <span class='hs-varid'>dflags</span> <span class='hs-conid'>Opt_D_dump_deriv</span> <span class='hs-str'>"Generic instances"</span>
<a name="line-50"></a>	         <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>pprInstInfoDetails</span> <span class='hs-varid'>gen_inst_info</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>	
<a name="line-51"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>gen_inst_info</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="get_generics"></a><span class='hs-definition'>get_generics</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyClDecl</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>InstInfo</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-54"></a><span class='hs-definition'>get_generics</span> <span class='hs-varid'>decl</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ClassDecl</span> <span class='hs-layout'>{</span><span class='hs-varid'>tcdLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>class_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcdMeths</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>def_methods</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-55"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>null</span> <span class='hs-varid'>generic_binds</span>
<a name="line-56"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span> <span class='hs-comment'>-- The comon case: no generic default methods</span>
<a name="line-57"></a>
<a name="line-58"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	<span class='hs-comment'>-- A source class decl with generic default methods</span>
<a name="line-59"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>recoverM</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>                                <span class='hs-varop'>$</span>
<a name="line-60"></a>    <span class='hs-varid'>tcAddDeclCtxt</span> <span class='hs-varid'>decl</span>                                  <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-61"></a>    <span class='hs-varid'>clas</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupLocatedClass</span> <span class='hs-varid'>class_name</span>
<a name="line-62"></a>
<a name="line-63"></a>	<span class='hs-comment'>-- Group by type, and</span>
<a name="line-64"></a>	<span class='hs-comment'>-- make an InstInfo out of each group</span>
<a name="line-65"></a>    <span class='hs-keyword'>let</span>
<a name="line-66"></a>	<span class='hs-varid'>groups</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>groupWith</span> <span class='hs-varid'>listToBag</span> <span class='hs-varid'>generic_binds</span>
<a name="line-67"></a>
<a name="line-68"></a>    <span class='hs-varid'>inst_infos</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkGenericInstance</span> <span class='hs-varid'>clas</span><span class='hs-layout'>)</span> <span class='hs-varid'>groups</span>
<a name="line-69"></a>
<a name="line-70"></a>	<span class='hs-comment'>-- Check that there is only one InstInfo for each type constructor</span>
<a name="line-71"></a>  	<span class='hs-comment'>-- The main way this can fail is if you write</span>
<a name="line-72"></a>	<span class='hs-comment'>--	f {| a+b |} ... = ...</span>
<a name="line-73"></a>	<span class='hs-comment'>--	f {| x+y |} ... = ...</span>
<a name="line-74"></a>	<span class='hs-comment'>-- Then at this point we'll have an InstInfo for each</span>
<a name="line-75"></a>	<span class='hs-comment'>--</span>
<a name="line-76"></a>	<span class='hs-comment'>-- The class should be unary, which is why simpleInstInfoTyCon should be ok</span>
<a name="line-77"></a>    <span class='hs-keyword'>let</span>
<a name="line-78"></a>	<span class='hs-varid'>tc_inst_infos</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span><span class='hs-layout'>,</span> <span class='hs-conid'>InstInfo</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-79"></a>	<span class='hs-varid'>tc_inst_infos</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>simpleInstInfoTyCon</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>inst_infos</span><span class='hs-keyglyph'>]</span>
<a name="line-80"></a>
<a name="line-81"></a>	<span class='hs-varid'>bad_groups</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>group</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>group</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>equivClassesByUniq</span> <span class='hs-varid'>get_uniq</span> <span class='hs-varid'>tc_inst_infos</span><span class='hs-layout'>,</span>
<a name="line-82"></a>			      <span class='hs-varid'>group</span> <span class='hs-varop'>`lengthExceeds`</span> <span class='hs-num'>1</span><span class='hs-keyglyph'>]</span>
<a name="line-83"></a>	<span class='hs-varid'>get_uniq</span> <span class='hs-layout'>(</span><span class='hs-varid'>tc</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'>getUnique</span> <span class='hs-varid'>tc</span>
<a name="line-84"></a>
<a name="line-85"></a>    <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-varid'>addErrTc</span> <span class='hs-varop'>.</span> <span class='hs-varid'>dupGenericInsts</span><span class='hs-layout'>)</span> <span class='hs-varid'>bad_groups</span>
<a name="line-86"></a>
<a name="line-87"></a>	<span class='hs-comment'>-- Check that there is an InstInfo for each generic type constructor</span>
<a name="line-88"></a>    <span class='hs-keyword'>let</span>
<a name="line-89"></a>	<span class='hs-varid'>missing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>genericTyConNames</span> <span class='hs-varop'>`minusList`</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>tyConName</span> <span class='hs-varid'>tc</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>tc</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tc_inst_infos</span><span class='hs-keyglyph'>]</span>
<a name="line-90"></a>
<a name="line-91"></a>    <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>missing</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>missingGenericInstances</span> <span class='hs-varid'>missing</span><span class='hs-layout'>)</span>
<a name="line-92"></a>
<a name="line-93"></a>    <span class='hs-varid'>return</span> <span class='hs-varid'>inst_infos</span>
<a name="line-94"></a>  <span class='hs-keyword'>where</span>
<a name="line-95"></a>    <span class='hs-varid'>generic_binds</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</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-keyglyph'>]</span>
<a name="line-96"></a>    <span class='hs-varid'>generic_binds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getGenericBinds</span> <span class='hs-varid'>def_methods</span>
<a name="line-97"></a><span class='hs-definition'>get_generics</span> <span class='hs-varid'>decl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"get_generics"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>decl</span><span class='hs-layout'>)</span>
<a name="line-98"></a>
<a name="line-99"></a>
<a name="line-100"></a><a name="getGenericBinds"></a><span class='hs-comment'>---------------------------------</span>
<a name="line-101"></a><span class='hs-definition'>getGenericBinds</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</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-keyglyph'>]</span>
<a name="line-102"></a>  <span class='hs-comment'>-- Takes a group of method bindings, finds the generic ones, and returns</span>
<a name="line-103"></a>  <span class='hs-comment'>-- them in finite map indexed by the type parameter in the definition.</span>
<a name="line-104"></a><span class='hs-definition'>getGenericBinds</span> <span class='hs-varid'>binds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>getGenericBind</span> <span class='hs-layout'>(</span><span class='hs-varid'>bagToList</span> <span class='hs-varid'>binds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-105"></a>
<a name="line-106"></a><a name="getGenericBind"></a><span class='hs-definition'>getGenericBind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsBindLR</span> <span class='hs-conid'>Name</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>LHsBindLR</span> <span class='hs-conid'>Name</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-107"></a><span class='hs-definition'>getGenericBind</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>bind</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FunBind</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fun_matches</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MatchGroup</span> <span class='hs-varid'>matches</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-108"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>groupWith</span> <span class='hs-varid'>wrap</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapCatMaybes</span> <span class='hs-varid'>maybeGenericMatch</span> <span class='hs-varid'>matches</span><span class='hs-layout'>)</span>
<a name="line-109"></a>  <span class='hs-keyword'>where</span>
<a name="line-110"></a>    <span class='hs-varid'>wrap</span> <span class='hs-varid'>ms</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-varid'>bind</span> <span class='hs-layout'>{</span> <span class='hs-varid'>fun_matches</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MatchGroup</span> <span class='hs-varid'>ms</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-111"></a><span class='hs-definition'>getGenericBind</span> <span class='hs-keyword'>_</span>
<a name="line-112"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-113"></a>
<a name="line-114"></a><a name="groupWith"></a><span class='hs-definition'>groupWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-115"></a><span class='hs-definition'>groupWith</span> <span class='hs-keyword'>_</span>  <span class='hs-conid'>[]</span> 	 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-116"></a><span class='hs-definition'>groupWith</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span><span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>prs</span><span class='hs-layout'>)</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'>op</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-varid'>vs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>groupWith</span> <span class='hs-varid'>op</span> <span class='hs-varid'>rest</span>
<a name="line-117"></a>    <span class='hs-keyword'>where</span>
<a name="line-118"></a>      <span class='hs-varid'>vs</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>this</span>
<a name="line-119"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>this</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>partition</span> <span class='hs-varid'>same_t</span> <span class='hs-varid'>prs</span>
<a name="line-120"></a>      <span class='hs-varid'>same_t</span> <span class='hs-layout'>(</span><span class='hs-varid'>t'</span><span class='hs-layout'>,</span> <span class='hs-sel'>_v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span> <span class='hs-varop'>`eqPatType`</span> <span class='hs-varid'>t'</span>
<a name="line-121"></a>
<a name="line-122"></a><a name="eqPatLType"></a><span class='hs-definition'>eqPatLType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-123"></a><span class='hs-definition'>eqPatLType</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>t1</span> <span class='hs-varop'>`eqPatType`</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>t2</span>
<a name="line-124"></a>
<a name="line-125"></a><a name="eqPatType"></a><span class='hs-definition'>eqPatType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-126"></a><span class='hs-comment'>-- A very simple equality function, only for </span>
<a name="line-127"></a><span class='hs-comment'>-- type patterns in generic function definitions.</span>
<a name="line-128"></a><span class='hs-definition'>eqPatType</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTyVar</span> <span class='hs-varid'>v1</span><span class='hs-layout'>)</span>       <span class='hs-layout'>(</span><span class='hs-conid'>HsTyVar</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span>    	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>v1</span><span class='hs-varop'>==</span><span class='hs-varid'>v2</span>
<a name="line-129"></a><span class='hs-definition'>eqPatType</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-varid'>s1</span> <span class='hs-varid'>t1</span><span class='hs-layout'>)</span>    <span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-varid'>s2</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>s1</span> <span class='hs-varop'>`eqPatLType`</span> <span class='hs-varid'>s2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>t1</span> <span class='hs-varop'>`eqPatLType`</span> <span class='hs-varid'>t2</span>
<a name="line-130"></a><span class='hs-definition'>eqPatType</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsOpTy</span> <span class='hs-varid'>s1</span> <span class='hs-varid'>op1</span> <span class='hs-varid'>t1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsOpTy</span> <span class='hs-varid'>s2</span> <span class='hs-varid'>op2</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s1</span> <span class='hs-varop'>`eqPatLType`</span> <span class='hs-varid'>s2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>t1</span> <span class='hs-varop'>`eqPatLType`</span> <span class='hs-varid'>t2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>op1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>op2</span>
<a name="line-131"></a><span class='hs-definition'>eqPatType</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsNumTy</span> <span class='hs-varid'>n1</span><span class='hs-layout'>)</span>	     <span class='hs-layout'>(</span><span class='hs-conid'>HsNumTy</span> <span class='hs-varid'>n2</span><span class='hs-layout'>)</span>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>n1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>n2</span>
<a name="line-132"></a><span class='hs-definition'>eqPatType</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-varid'>t1</span><span class='hs-layout'>)</span>	     <span class='hs-varid'>t2</span>			<span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>t1</span> <span class='hs-varop'>`eqPatType`</span> <span class='hs-varid'>t2</span>
<a name="line-133"></a><span class='hs-definition'>eqPatType</span> <span class='hs-varid'>t1</span>		     <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>t1</span> <span class='hs-varop'>`eqPatType`</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>t2</span>
<a name="line-134"></a><span class='hs-definition'>eqPatType</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-135"></a>
<a name="line-136"></a><a name="mkGenericInstance"></a><span class='hs-comment'>---------------------------------</span>
<a name="line-137"></a><span class='hs-definition'>mkGenericInstance</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Class</span>
<a name="line-138"></a>		  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-139"></a>		  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstInfo</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-140"></a>
<a name="line-141"></a><span class='hs-definition'>mkGenericInstance</span> <span class='hs-varid'>clas</span> <span class='hs-layout'>(</span><span class='hs-varid'>hs_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>binds</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-142"></a>  <span class='hs-comment'>-- Make a generic instance declaration</span>
<a name="line-143"></a>  <span class='hs-comment'>-- For example:	instance (C a, C b) =&gt; C (a+b) where { binds }</span>
<a name="line-144"></a>
<a name="line-145"></a>	<span class='hs-comment'>-- Extract the universally quantified type variables</span>
<a name="line-146"></a>	<span class='hs-comment'>-- and wrap them as forall'd tyvars, so that kind inference</span>
<a name="line-147"></a>	<span class='hs-comment'>-- works in the standard way</span>
<a name="line-148"></a>    <span class='hs-keyword'>let</span>
<a name="line-149"></a>	<span class='hs-varid'>sig_tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span><span class='hs-varop'>.</span><span class='hs-conid'>UserTyVar</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>nameSetToList</span> <span class='hs-layout'>(</span><span class='hs-varid'>extractHsTyVars</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-varid'>hs_ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-150"></a>	<span class='hs-varid'>hs_forall_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noLoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkExplicitHsForAllTy</span> <span class='hs-varid'>sig_tvs</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-varid'>hs_ty</span><span class='hs-layout'>)</span>
<a name="line-151"></a>
<a name="line-152"></a>	<span class='hs-comment'>-- Type-check the instance type, and check its form</span>
<a name="line-153"></a>    <span class='hs-varid'>forall_inst_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcHsSigType</span> <span class='hs-conid'>GenPatCtxt</span> <span class='hs-varid'>hs_forall_ty</span>
<a name="line-154"></a>    <span class='hs-keyword'>let</span>
<a name="line-155"></a>	<span class='hs-layout'>(</span><span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> <span class='hs-varid'>inst_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitForAllTys</span> <span class='hs-varid'>forall_inst_ty</span>
<a name="line-156"></a>
<a name="line-157"></a>    <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>validGenericInstanceType</span> <span class='hs-varid'>inst_ty</span><span class='hs-layout'>)</span>
<a name="line-158"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>badGenericInstanceType</span> <span class='hs-varid'>binds</span><span class='hs-layout'>)</span>
<a name="line-159"></a>
<a name="line-160"></a>	<span class='hs-comment'>-- Make the dictionary function.</span>
<a name="line-161"></a>    <span class='hs-varid'>span</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSrcSpanM</span>
<a name="line-162"></a>    <span class='hs-varid'>overlap_flag</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getOverlapFlag</span>
<a name="line-163"></a>    <span class='hs-varid'>dfun_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newDFunName</span> <span class='hs-varid'>clas</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>inst_ty</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>span</span>
<a name="line-164"></a>    <span class='hs-keyword'>let</span>
<a name="line-165"></a>	<span class='hs-varid'>inst_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkClassPred</span> <span class='hs-varid'>clas</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkTyVarTy</span> <span class='hs-varid'>tv</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tyvars</span><span class='hs-keyglyph'>]</span>
<a name="line-166"></a>	<span class='hs-varid'>dfun_id</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkDictFunId</span> <span class='hs-varid'>dfun_name</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>inst_theta</span> <span class='hs-varid'>clas</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>inst_ty</span><span class='hs-keyglyph'>]</span>
<a name="line-167"></a>	<span class='hs-varid'>ispec</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalInstance</span> <span class='hs-varid'>dfun_id</span> <span class='hs-varid'>overlap_flag</span>
<a name="line-168"></a>
<a name="line-169"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstInfo</span> <span class='hs-layout'>{</span> <span class='hs-varid'>iSpec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ispec</span><span class='hs-layout'>,</span> <span class='hs-varid'>iBinds</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VanillaInst</span> <span class='hs-varid'>binds</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>False</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
		Error messages
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcAddDeclCtxt"></a><span class='hs-definition'>tcAddDeclCtxt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyClDecl</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span>
<a name="line-2"></a><span class='hs-definition'>tcAddDeclCtxt</span> <span class='hs-varid'>decl</span> <span class='hs-varid'>thing_inside</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addErrCtxt</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>thing_inside</span>
<a name="line-4"></a>  <span class='hs-keyword'>where</span>
<a name="line-5"></a>     <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isClassDecl</span> <span class='hs-varid'>decl</span>  <span class='hs-keyglyph'>=</span> <span class='hs-str'>"class"</span>
<a name="line-6"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isTypeDecl</span> <span class='hs-varid'>decl</span>   <span class='hs-keyglyph'>=</span> <span class='hs-str'>"type synonym"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>maybeInst</span>
<a name="line-7"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isDataDecl</span> <span class='hs-varid'>decl</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>tcdND</span> <span class='hs-varid'>decl</span> <span class='hs-varop'>==</span> <span class='hs-conid'>NewType</span> 
<a name="line-8"></a>				 <span class='hs-keyword'>then</span> <span class='hs-str'>"newtype"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>maybeInst</span>
<a name="line-9"></a>				 <span class='hs-keyword'>else</span> <span class='hs-str'>"data type"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>maybeInst</span>
<a name="line-10"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isFamilyDecl</span> <span class='hs-varid'>decl</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"family"</span>
<a name="line-11"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"tcAddDeclCtxt/thing"</span>
<a name="line-12"></a>
<a name="line-13"></a>     <span class='hs-varid'>maybeInst</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isFamInstDecl</span> <span class='hs-varid'>decl</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>" instance"</span>
<a name="line-14"></a>	       <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-str'>""</span>
<a name="line-15"></a>
<a name="line-16"></a>     <span class='hs-varid'>ctxt</span> <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'>"In the"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span> <span class='hs-varid'>thing</span><span class='hs-layout'>,</span> 
<a name="line-17"></a>		  <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"declaration for"</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-layout'>(</span><span class='hs-varid'>tcdName</span> <span class='hs-varid'>decl</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="badMethodErr"></a><span class='hs-definition'>badMethodErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</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-20"></a><span class='hs-definition'>badMethodErr</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>op</span>
<a name="line-21"></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'>"Class"</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'>clas</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-22"></a>	  <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"does not have a method"</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'>op</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-23"></a>
<a name="line-24"></a><a name="badATErr"></a><span class='hs-definition'>badATErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Class</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-25"></a><span class='hs-definition'>badATErr</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>at</span>
<a name="line-26"></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'>"Class"</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'>clas</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-27"></a>	  <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"does not have an associated type"</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'>at</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="omittedATWarn"></a><span class='hs-definition'>omittedATWarn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-30"></a><span class='hs-definition'>omittedATWarn</span> <span class='hs-varid'>at</span>
<a name="line-31"></a>  <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 explicit AT declaration 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'>at</span><span class='hs-layout'>)</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="badGenericInstance"></a><span class='hs-definition'>badGenericInstance</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Var</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-34"></a><span class='hs-definition'>badGenericInstance</span> <span class='hs-varid'>sel_id</span> <span class='hs-varid'>because</span>
<a name="line-35"></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'>"Can't derive generic code 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'>sel_id</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-36"></a>	 <span class='hs-varid'>because</span><span class='hs-keyglyph'>]</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="notSimple"></a><span class='hs-definition'>notSimple</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-39"></a><span class='hs-definition'>notSimple</span> <span class='hs-varid'>inst_tys</span>
<a name="line-40"></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'>"because the instance type(s)"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-41"></a>	  <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'>inst_tys</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-42"></a>	  <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is not a simple type of form (T a1 ... an)"</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="notGeneric"></a><span class='hs-definition'>notGeneric</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-45"></a><span class='hs-definition'>notGeneric</span> <span class='hs-varid'>tycon</span>
<a name="line-46"></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'>"because the instance type constructor"</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'>tycon</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</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'>"was not compiled with -XGenerics"</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="badGenericInstanceType"></a><span class='hs-definition'>badGenericInstanceType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-50"></a><span class='hs-definition'>badGenericInstanceType</span> <span class='hs-varid'>binds</span>
<a name="line-51"></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'>"Illegal type pattern in the generic bindings"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-52"></a>	  <span class='hs-varid'>nest</span> <span class='hs-num'>4</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>binds</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-53"></a>
<a name="line-54"></a><a name="missingGenericInstances"></a><span class='hs-definition'>missingGenericInstances</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'>SDoc</span>
<a name="line-55"></a><span class='hs-definition'>missingGenericInstances</span> <span class='hs-varid'>missing</span>
<a name="line-56"></a>  <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'>"Missing type patterns for"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>pprQuotedList</span> <span class='hs-varid'>missing</span>
<a name="line-57"></a>	  
<a name="line-58"></a><a name="dupGenericInsts"></a><span class='hs-definition'>dupGenericInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span><span class='hs-layout'>,</span> <span class='hs-conid'>InstInfo</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-59"></a><span class='hs-definition'>dupGenericInsts</span> <span class='hs-varid'>tc_inst_infos</span>
<a name="line-60"></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'>"More than one type pattern for a single generic type constructor:"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-61"></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-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ppr_inst_ty</span> <span class='hs-varid'>tc_inst_infos</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-62"></a>	  <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"All the type patterns for a generic type constructor must be identical"</span><span class='hs-layout'>)</span>
<a name="line-63"></a>    <span class='hs-keyglyph'>]</span>
<a name="line-64"></a>  <span class='hs-keyword'>where</span> 
<a name="line-65"></a>    <span class='hs-varid'>ppr_inst_ty</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>inst</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>simpleInstInfoTy</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span>
<a name="line-66"></a>
<a name="line-67"></a><a name="mixedGenericErr"></a><span class='hs-definition'>mixedGenericErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-68"></a><span class='hs-definition'>mixedGenericErr</span> <span class='hs-varid'>op</span>
<a name="line-69"></a>  <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'>"Can't mix generic and non-generic equations for class method"</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'>op</span><span class='hs-layout'>)</span>
</pre>\end{code}
</body>
</html>