+\subsection{Instance declarations}
+%* *
+%*********************************************************
+
+\begin{code}
+rnInstDecl (InstDecl inst_ty mbinds uprags maybe_dfun_rdr_name src_loc)
+ -- Used for both source and interface file decls
+ = pushSrcLocRn src_loc $
+ rnHsSigType (text "an instance decl") inst_ty `thenRn` \ inst_ty' ->
+
+ (case maybe_dfun_rdr_name of
+ Nothing -> returnRn Nothing
+ Just dfun_rdr_name -> lookupIfaceName dfun_rdr_name `thenRn` \ dfun_name ->
+ returnRn (Just dfun_name)
+ ) `thenRn` \ maybe_dfun_name ->
+
+ -- The typechecker checks that all the bindings are for the right class.
+ returnRn (InstDecl inst_ty' EmptyMonoBinds [] maybe_dfun_name src_loc)
+
+-- Compare finishSourceTyClDecl
+finishSourceInstDecl (InstDecl _ mbinds uprags _ _ )
+ (InstDecl inst_ty _ _ maybe_dfun_name src_loc)
+ -- Used for both source decls only
+ = ASSERT( not (maybeToBool maybe_dfun_name) ) -- Source decl!
+ let
+ meth_doc = text "the bindings in an instance declaration"
+ meth_names = collectLocatedMonoBinders mbinds
+ inst_tyvars = case inst_ty of
+ HsForAllTy (Just inst_tyvars) _ _ -> inst_tyvars
+ other -> []
+ -- (Slightly strangely) the forall-d tyvars scope over
+ -- the method bindings too
+ in
+
+ -- Rename the bindings
+ -- NB meth_names can be qualified!
+ checkDupNames meth_doc meth_names `thenRn_`
+ extendTyVarEnvFVRn (map hsTyVarName inst_tyvars) (
+ rnMethodBinds [] mbinds
+ ) `thenRn` \ (mbinds', meth_fvs) ->
+ let
+ binders = collectMonoBinders mbinds'
+ binder_set = mkNameSet binders
+ in
+ -- Rename the prags and signatures.
+ -- Note that the type variables are not in scope here,
+ -- so that instance Eq a => Eq (T a) where
+ -- {-# SPECIALISE instance Eq a => Eq (T [a]) #-}
+ -- works OK.
+ --
+ -- But the (unqualified) method names are in scope
+ bindLocalNames binders (
+ renameSigsFVs (okInstDclSig binder_set) uprags
+ ) `thenRn` \ (uprags', prag_fvs) ->
+
+ returnRn (InstDecl inst_ty mbinds' uprags' maybe_dfun_name src_loc,
+ meth_fvs `plusFV` prag_fvs)
+\end{code}
+
+%*********************************************************
+%* *
+\subsection{Rules}