<?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'>-></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'>-></span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span> <a name="line-4"></a> <span class='hs-keyglyph'>-></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'><-</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'><-</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'><-</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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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 <=> 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'><-</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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>HsBindLR</span> <span class='hs-conid'>Name</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>LSig</span> <span class='hs-conid'>Name</span> <a name="line-45"></a> <span class='hs-keyglyph'>-></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'><-</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'>-></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'>-></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'>-></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'>-></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'><-</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 -> (..., ..., ...)</span> <a name="line-15"></a> <span class='hs-comment'>-- dm1 = \d -> case ds d of (a,b,c) -> 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'><-</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'><-</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'><-</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'><-</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'>-></span> <span class='hs-conid'>Class</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ThetaType</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>LHsBinds</span> <span class='hs-conid'>Name</span> <a name="line-50"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>TcSigFun</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>TcPragFun</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-51"></a> <span class='hs-keyglyph'>-></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'><-</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'><-</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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>Class</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcTyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-></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'>-></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'>-></span> <span class='hs-conid'>Id</span> <a name="line-93"></a> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>TcSigFun</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>TcPragFun</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>LHsBind</span> <span class='hs-conid'>Name</span> <a name="line-95"></a> <span class='hs-keyglyph'>-></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'>-></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'>-></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'><-</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'><-</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'>-></span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>dm_name</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>meth_name</span> <span class='hs-keyglyph'><-</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'>-></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'>-></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'><-</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'><-</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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'><-</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'><+></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'><+></span> <span class='hs-varid'>equals</span> <span class='hs-varop'><+></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'><-</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 (...) => 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'>-></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'>-></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'>-></span> <span class='hs-conid'>Nothing</span> <a name="line-34"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></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'>-></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'><-</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'><-</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'>-></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'><-</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'><-</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'><-</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'><-</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'><-</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'>-></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'>-></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'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</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-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</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-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'>-></span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'>&&</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'>&&</span> <span class='hs-varid'>t1</span> <span class='hs-varop'>`eqPatLType`</span> <span class='hs-varid'>t2</span> <span class='hs-varop'>&&</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'>-></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'>-></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) => 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'><-</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'><-</span> <span class='hs-varid'>getSrcSpanM</span> <a name="line-162"></a> <span class='hs-varid'>overlap_flag</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>getOverlapFlag</span> <a name="line-163"></a> <span class='hs-varid'>dfun_name</span> <span class='hs-keyglyph'><-</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'><-</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'>-></span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'>-></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'><+></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'>-></span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-></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'><+></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'>-></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'>-></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'><+></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'><+></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'>-></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'>-></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'><+></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'>-></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'>-></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'><+></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>