2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[RnBinds]{Renaming and dependency analysis of bindings}
6 This module does renaming and dependency analysis on value bindings in
7 the abstract syntax. It does {\em not} do cycle-checks on class or
8 type-synonym declarations; those cannot be done at this stage because
9 they may be affected by renaming (which isn't fully worked out yet).
12 #include "HsVersions.h"
23 import RnLoop -- break the RnPass4/RnExpr4/RnBinds4 loops
26 import HsPragmas ( isNoGenPragmas, noGenPragmas )
30 import RnExpr ( rnMatch, rnGRHSsAndBinds, rnPat )
32 import CmdLineOpts ( opt_SigsRequired )
33 import Digraph ( stronglyConnComp )
34 import ErrUtils ( addErrLoc, addShortErrLocLine )
35 import Name ( RdrName )
36 import Maybes ( catMaybes )
38 import UniqSet ( emptyUniqSet, unitUniqSet, mkUniqSet,
39 unionUniqSets, unionManyUniqSets,
40 elementOfUniqSet, uniqSetToList, UniqSet(..) )
41 import Util ( thenCmp, isIn, removeDups, panic, panic#, assertPanic )
44 -- ToDo: Put the annotations into the monad, so that they arrive in the proper
45 -- place and can be used when complaining.
47 The code tree received by the function @rnBinds@ contains definitions
48 in where-clauses which are all apparently mutually recursive, but which may
49 not really depend upon each other. For example, in the top level program
54 the definitions of @a@ and @y@ do not depend on each other at all.
55 Unfortunately, the typechecker cannot always check such definitions.
56 \footnote{Mycroft, A. 1984. Polymorphic type schemes and recursive
57 definitions. In Proceedings of the International Symposium on Programming,
58 Toulouse, pp. 217-39. LNCS 167. Springer Verlag.}
59 However, the typechecker usually can check definitions in which only the
60 strongly connected components have been collected into recursive bindings.
61 This is precisely what the function @rnBinds@ does.
63 ToDo: deal with case where a single monobinds binds the same variable
66 Sets of variable names are represented as sets explicitly, rather than lists.
69 type DefinedVars = UniqSet RnName
70 type FreeVars = UniqSet RnName
75 The vertag tag is a unique @Int@; the tags only need to be unique
76 within one @MonoBinds@, so that unique-Int plumbing is done explicitly
77 (heavy monad machinery not needed).
81 type Cycle = [VertexTag]
82 type Edge = (VertexTag, VertexTag)
85 %************************************************************************
87 %* naming conventions *
89 %************************************************************************
90 \subsection[name-conventions]{Name conventions}
92 The basic algorithm involves walking over the tree and returning a tuple
93 containing the new tree plus its free variables. Some functions, such
94 as those walking polymorphic bindings (HsBinds) and qualifier lists in
95 list comprehensions (@Quals@), return the variables bound in local
96 environments. These are then used to calculate the free variables of the
97 expression evaluated in these environments.
99 Conventions for variable names are as follows:
102 new code is given a prime to distinguish it from the old.
105 a set of variables defined in @Exp@ is written @dvExp@
108 a set of variables free in @Exp@ is written @fvExp@
111 %************************************************************************
113 %* analysing polymorphic bindings (HsBinds, Bind, MonoBinds) *
115 %************************************************************************
116 \subsubsection[dep-HsBinds]{Polymorphic bindings}
118 Non-recursive expressions are reconstructed without any changes at top
119 level, although their component expressions may have to be altered.
120 However, non-recursive expressions are currently not expected as
121 \Haskell{} programs, and this code should not be executed.
123 Monomorphic bindings contain information that is returned in a tuple
124 (a @FlatMonoBindsInfo@) containing:
128 a unique @Int@ that serves as the ``vertex tag'' for this binding.
131 the name of a function or the names in a pattern. These are a set
132 referred to as @dvLhs@, the defined variables of the left hand side.
135 the free variables of the body. These are referred to as @fvBody@.
138 the definition's actual code. This is referred to as just @code@.
141 The function @nonRecDvFv@ returns two sets of variables. The first is
142 the set of variables defined in the set of monomorphic bindings, while the
143 second is the set of free variables in those bindings.
145 The set of variables defined in a non-recursive binding is just the
146 union of all of them, as @union@ removes duplicates. However, the
147 free variables in each successive set of cumulative bindings is the
148 union of those in the previous set plus those of the newest binding after
149 the defined variables of the previous set have been removed.
151 @rnMethodBinds@ deals only with the declarations in class and
152 instance declarations. It expects only to see @FunMonoBind@s, and
153 it expects the global environment to contain bindings for the binders
154 (which are all class operations).
157 rnTopBinds :: RdrNameHsBinds -> RnM_Fixes s RenamedHsBinds
158 rnMethodBinds :: RnName{-class-} -> RdrNameMonoBinds -> RnM_Fixes s RenamedMonoBinds
159 rnBinds :: RdrNameHsBinds -> RnM_Fixes s (RenamedHsBinds, FreeVars, [RnName])
161 rnTopBinds EmptyBinds = returnRn EmptyBinds
162 rnTopBinds (SingleBind (RecBind bind)) = rnTopMonoBinds bind []
163 rnTopBinds (BindWith (RecBind bind) sigs) = rnTopMonoBinds bind sigs
164 -- the parser doesn't produce other forms
166 -- ********************************************************************
168 rnMethodBinds class_name EmptyMonoBinds = returnRn EmptyMonoBinds
170 rnMethodBinds class_name (AndMonoBinds mb1 mb2)
171 = andRn AndMonoBinds (rnMethodBinds class_name mb1)
172 (rnMethodBinds class_name mb2)
174 rnMethodBinds class_name (FunMonoBind occname matches locn)
175 = pushSrcLocRn locn $
176 lookupClassOp class_name occname `thenRn` \ op_name ->
177 mapAndUnzipRn rnMatch matches `thenRn` \ (new_matches, _) ->
178 returnRn (FunMonoBind op_name new_matches locn)
180 rnMethodBinds class_name (PatMonoBind (VarPatIn occname) grhss_and_binds locn)
181 = pushSrcLocRn locn $
182 lookupClassOp class_name occname `thenRn` \ op_name ->
183 rnGRHSsAndBinds grhss_and_binds `thenRn` \ (grhss_and_binds', _) ->
184 returnRn (PatMonoBind (VarPatIn op_name) grhss_and_binds' locn)
186 -- Can't handle method pattern-bindings which bind multiple methods.
187 rnMethodBinds _ mbind@(PatMonoBind other_pat _ locn)
188 = failButContinueRn EmptyMonoBinds (methodBindErr mbind locn)
190 -- ********************************************************************
192 rnBinds EmptyBinds = returnRn (EmptyBinds,emptyUniqSet,[])
193 rnBinds (SingleBind (RecBind bind)) = rnNestedMonoBinds bind []
194 rnBinds (BindWith (RecBind bind) sigs) = rnNestedMonoBinds bind sigs
195 -- the parser doesn't produce other forms
199 - collects up the binders for this declaration group,
200 - checkes that they form a set
201 - extends the environment to bind them to new local names
202 - calls @rnMonoBinds@ to do the real work
204 In contrast, @rnTopMonoBinds@ doesn't extend the environment, because that's
205 already done in pass3. All it does is call @rnMonoBinds@ and discards
209 rnTopMonoBinds :: RdrNameMonoBinds -> [RdrNameSig] -> RnM_Fixes s RenamedHsBinds
211 rnTopMonoBinds EmptyMonoBinds sigs = returnRn EmptyBinds
213 rnTopMonoBinds mbs sigs
214 = rnBindSigs True{-top-level-} (collectMonoBinders mbs) sigs `thenRn` \ siglist ->
215 rnMonoBinds mbs siglist `thenRn` \ (new_binds, fv_set) ->
219 rnNestedMonoBinds :: RdrNameMonoBinds -> [RdrNameSig]
220 -> RnM_Fixes s (RenamedHsBinds, FreeVars, [RnName])
222 rnNestedMonoBinds EmptyMonoBinds sigs
223 = returnRn (EmptyBinds, emptyUniqSet, [])
225 rnNestedMonoBinds mbinds sigs -- Non-empty monobinds
227 -- Extract all the binders in this group,
228 -- and extend current scope, inventing new names for the new binders
229 -- This also checks that the names form a set
231 mbinders_w_srclocs = collectMonoBindersAndLocs mbinds
232 mbinders = map fst mbinders_w_srclocs
234 newLocalNames "variable"
235 mbinders_w_srclocs `thenRn` \ new_mbinders ->
237 extendSS2 new_mbinders (
238 rnBindSigs False{-not top- level-} mbinders sigs `thenRn` \ siglist ->
239 rnMonoBinds mbinds siglist
240 ) `thenRn` \ (new_binds, fv_set) ->
241 returnRn (new_binds, fv_set, new_mbinders)
244 @rnMonoBinds@ is used by *both* top-level and nested bindings. It
245 assumes that all variables bound in this group are already in scope.
246 This is done *either* by pass 3 (for the top-level bindings),
247 *or* by @rnNestedMonoBinds@ (for the nested ones).
250 rnMonoBinds :: RdrNameMonoBinds
251 -> [RenamedSig] -- Signatures attached to this group
252 -> RnM_Fixes s (RenamedHsBinds, FreeVars)
254 rnMonoBinds mbinds siglist
256 -- Rename the bindings, returning a MonoBindsInfo
257 -- which is a list of indivisible vertices so far as
258 -- the strongly-connected-components (SCC) analysis is concerned
259 flattenMonoBinds 0 siglist mbinds `thenRn` \ (_, mbinds_info) ->
261 -- Do the SCC analysis
262 let vertices = mkVertices mbinds_info
263 edges = mkEdges vertices mbinds_info
265 scc_result = stronglyConnComp (==) edges vertices
267 -- Deal with bound and free-var calculation
268 rhs_free_vars = foldr f emptyUniqSet mbinds_info
270 final_binds = reconstructRec scc_result edges mbinds_info
272 happy_answer = returnRn (final_binds, rhs_free_vars)
274 case (inline_sigs_in_recursive_binds final_binds) of
275 Nothing -> happy_answer
276 Just names_n_locns ->
277 -- SLPJ: sometimes want recursive INLINE for worker wrapper style stuff
278 -- addErrRn (inlineInRecursiveBindsErr names_n_locns) `thenRn_`
279 {-not so-}happy_answer
281 f :: (a,b, FreeVars, c,d) -> FreeVars -> FreeVars
283 f (_, _, fvs_body, _, _) fvs_sofar = fvs_sofar `unionUniqSets` fvs_body
285 inline_sigs_in_recursive_binds (BindWith (RecBind _) sigs)
286 = case [(n, locn) | (InlineSig n locn) <- sigs ] of
292 -- Allow INLINEd recursive functions if they are
293 -- designated DEFORESTable too.
294 case [(n, locn) | (DeforestSig n locn) <- sigs ] of
299 inline_sigs_in_recursive_binds (ThenBinds b1 b2)
300 = case (inline_sigs_in_recursive_binds b1) of
301 Nothing -> inline_sigs_in_recursive_binds b2
302 Just x -> Just x -- NB: won't report error(s) in b2
304 inline_sigs_in_recursive_binds anything_else = Nothing
307 @flattenMonoBinds@ is ever-so-slightly magical in that it sticks
308 unique ``vertex tags'' on its output; minor plumbing required.
311 flattenMonoBinds :: Int -- Next free vertex tag
312 -> [RenamedSig] -- Signatures
314 -> RnM_Fixes s (Int, FlatMonoBindsInfo)
316 flattenMonoBinds uniq sigs EmptyMonoBinds = returnRn (uniq, [])
318 flattenMonoBinds uniq sigs (AndMonoBinds mB1 mB2)
319 = flattenMonoBinds uniq sigs mB1 `thenRn` \ (uniq1, flat1) ->
320 flattenMonoBinds uniq1 sigs mB2 `thenRn` \ (uniq2, flat2) ->
321 returnRn (uniq2, flat1 ++ flat2)
323 flattenMonoBinds uniq sigs (PatMonoBind pat grhss_and_binds locn)
324 = pushSrcLocRn locn $
325 rnPat pat `thenRn` \ pat' ->
326 rnGRHSsAndBinds grhss_and_binds `thenRn` \ (grhss_and_binds', fvs) ->
328 -- Find which things are bound in this group
330 names_bound_here = collectPatBinders pat'
332 sigs_etc_for_here = foldl (sig_for_here (\ n -> n `is_elem` names_bound_here))
335 sigs_fvs = foldr sig_fv emptyUniqSet sigs_etc_for_here
337 is_elem = isIn "flattenMonoBinds"
342 mkUniqSet names_bound_here,
343 fvs `unionUniqSets` sigs_fvs,
344 PatMonoBind pat' grhss_and_binds' locn,
349 flattenMonoBinds uniq sigs (FunMonoBind name matches locn)
350 = pushSrcLocRn locn $
351 lookupValue name `thenRn` \ name' ->
352 mapAndUnzipRn rnMatch matches `thenRn` \ (new_matches, fv_lists) ->
354 fvs = unionManyUniqSets fv_lists
356 sigs_for_me = foldl (sig_for_here (\ n -> n == name')) [] sigs
358 sigs_fvs = foldr sig_fv emptyUniqSet sigs_for_me
364 fvs `unionUniqSets` sigs_fvs,
365 FunMonoBind name' new_matches locn,
371 Grab type-signatures/user-pragmas of interest:
373 sig_for_here want_me acc s@(Sig n _ _ _) | want_me n = s:acc
374 sig_for_here want_me acc s@(InlineSig n _) | want_me n = s:acc
375 sig_for_here want_me acc s@(DeforestSig n _) | want_me n = s:acc
376 sig_for_here want_me acc s@(SpecSig n _ _ _) | want_me n = s:acc
377 sig_for_here want_me acc s@(MagicUnfoldingSig n _ _)
379 sig_for_here want_me acc other_wise = acc
381 -- If a SPECIALIZE pragma is of the "... = blah" form,
382 -- then we'd better make sure "blah" is taken into
383 -- acct in the dependency analysis (or we get an
384 -- unexpected out-of-scope error)! WDP 95/07
386 sig_fv (SpecSig _ _ (Just blah) _) acc = acc `unionUniqSets` unitUniqSet blah
390 %************************************************************************
392 \subsection[reconstruct-deps]{Reconstructing dependencies}
394 %************************************************************************
396 This @MonoBinds@- and @ClassDecls@-specific code is segregated here,
397 as the two cases are similar.
400 reconstructRec :: [Cycle] -- Result of SCC analysis; at least one
401 -> [Edge] -- Original edges
405 reconstructRec cycles edges mbi
406 = foldr1 ThenBinds (map (reconstructCycle mbi) cycles)
408 reconstructCycle :: FlatMonoBindsInfo -> Cycle -> RenamedHsBinds
410 reconstructCycle mbi2 cycle
411 = BIND [(binds,sigs) | (vertex, _, _, binds, sigs) <- mbi2, vertex `is_elem` cycle]
412 _TO_ relevant_binds_and_sigs ->
414 BIND (unzip relevant_binds_and_sigs) _TO_ (binds, sig_lists) ->
416 BIND (foldr AndMonoBinds EmptyMonoBinds binds) _TO_ this_gp_binds ->
418 this_gp_sigs = foldr1 (++) sig_lists
419 have_sigs = not (null sig_lists)
420 -- ToDo: this might not be the right
421 -- thing to call this predicate;
422 -- e.g. "have_sigs [[], [], []]" ???????????
424 mk_binds this_gp_binds this_gp_sigs (isCyclic edges cycle) have_sigs
427 is_elem = isIn "reconstructRec"
429 mk_binds :: RenamedMonoBinds -> [RenamedSig]
430 -> Bool -> Bool -> RenamedHsBinds
432 mk_binds bs ss True False = SingleBind (RecBind bs)
433 mk_binds bs ss True True{-have sigs-} = BindWith (RecBind bs) ss
434 mk_binds bs ss False False = SingleBind (NonRecBind bs)
435 mk_binds bs ss False True{-have sigs-} = BindWith (NonRecBind bs) ss
437 -- moved from Digraph, as this is the only use here
438 -- (avoid overloading cost). We have to use elem
439 -- (not FiniteMaps or whatever), because there may be
440 -- many edges out of one vertex. We give it its own
441 -- "elem" just for speed.
443 isCyclic es [] = panic "isCyclic: empty component"
444 isCyclic es [v] = (v,v) `elem` es
445 isCyclic es vs = True
448 elem x (y:ys) = x==y || elem x ys
451 %************************************************************************
453 %* Manipulating FlatMonoBindInfo *
455 %************************************************************************
457 During analysis a @MonoBinds@ is flattened to a @FlatMonoBindsInfo@.
458 The @RenamedMonoBinds@ is always an empty bind, a pattern binding or
459 a function binding, and has itself been dependency-analysed and
463 type FlatMonoBindsInfo
464 = [(VertexTag, -- Identifies the vertex
465 UniqSet RnName, -- Set of names defined in this vertex
466 UniqSet RnName, -- Set of names used in this vertex
467 RenamedMonoBinds, -- Binding for this vertex (always just one binding, either fun or pat)
468 [RenamedSig]) -- Signatures, if any, for this vertex
471 mkVertices :: FlatMonoBindsInfo -> [VertexTag]
472 mkVertices info = [ vertex | (vertex,_,_,_,_) <- info]
474 mkEdges :: [VertexTag] -> FlatMonoBindsInfo -> [Edge]
476 mkEdges vertices flat_info
477 -- An edge (v,v') indicates that v depends on v'
478 = [ (source_vertex, target_vertex)
479 | (source_vertex, _, used_names, _, _) <- flat_info,
480 target_name <- uniqSetToList used_names,
481 target_vertex <- vertices_defining target_name flat_info
484 -- If each name only has one binding in this group, then
485 -- vertices_defining will always return the empty list, or a
486 -- singleton. The case when there is more than one binding (an
487 -- error) needs more thought.
489 vertices_defining name flat_info2
490 = [ vertex | (vertex, names_defined, _, _, _) <- flat_info2,
491 name `elementOfUniqSet` names_defined
496 %************************************************************************
498 \subsubsection[dep-Sigs]{Signatures (and user-pragmas for values)}
500 %************************************************************************
502 @rnBindSigs@ checks for: (a)~more than one sig for one thing;
503 (b)~signatures given for things not bound here; (c)~with suitably
504 flaggery, that all top-level things have type signatures.
507 rnBindSigs :: Bool -- True <=> top-level binders
508 -> [RdrName] -- Binders for this decl group
510 -> RnM_Fixes s [RenamedSig] -- List of Sig constructors
512 rnBindSigs is_toplev binder_occnames sigs
514 -- Rename the signatures
515 -- Will complain about sigs for variables not in this group
516 mapRn rename_sig sigs `thenRn` \ sigs_maybe ->
518 sigs' = catMaybes sigs_maybe
520 -- Discard unbound ones we've already complained about, so we
521 -- complain about duplicate ones.
523 (goodies, dups) = removeDups compare (filter not_unbound sigs')
525 mapRn (addErrRn . dupSigDeclErr) dups `thenRn_`
527 getSrcLocRn `thenRn` \ locn ->
529 (if (is_toplev && opt_SigsRequired) then
531 sig_frees = catMaybes (map (sig_free sigs) binder_occnames)
533 mapRn (addErrRn . missingSigErr locn) sig_frees
538 returnRn sigs' -- bad ones and all:
539 -- we need bindings of *some* sort for every name
541 rename_sig (Sig v ty pragmas src_loc)
542 = pushSrcLocRn src_loc $
543 if not (v `elem` binder_occnames) then
544 addErrRn (unknownSigDeclErr "type signature" v src_loc) `thenRn_`
547 lookupValue v `thenRn` \ new_v ->
548 rnPolyType nullTyVarNamesEnv ty `thenRn` \ new_ty ->
550 ASSERT(isNoGenPragmas pragmas)
551 returnRn (Just (Sig new_v new_ty noGenPragmas src_loc))
553 -- and now, the various flavours of value-modifying user-pragmas:
555 rename_sig (SpecSig v ty using src_loc)
556 = pushSrcLocRn src_loc $
557 if not (v `elem` binder_occnames) then
558 addErrRn (unknownSigDeclErr "SPECIALIZE pragma" v src_loc) `thenRn_`
561 lookupValue v `thenRn` \ new_v ->
562 rnPolyType nullTyVarNamesEnv ty `thenRn` \ new_ty ->
563 rn_using using `thenRn` \ new_using ->
564 returnRn (Just (SpecSig new_v new_ty new_using src_loc))
566 rn_using Nothing = returnRn Nothing
567 rn_using (Just x) = lookupValue x `thenRn` \ new_x ->
568 returnRn (Just new_x)
570 rename_sig (InlineSig v src_loc)
571 = pushSrcLocRn src_loc $
572 if not (v `elem` binder_occnames) then
573 addErrRn (unknownSigDeclErr "INLINE pragma" v src_loc) `thenRn_`
576 lookupValue v `thenRn` \ new_v ->
577 returnRn (Just (InlineSig new_v src_loc))
579 rename_sig (DeforestSig v src_loc)
580 = pushSrcLocRn src_loc $
581 if not (v `elem` binder_occnames) then
582 addErrRn (unknownSigDeclErr "DEFOREST pragma" v src_loc) `thenRn_`
585 lookupValue v `thenRn` \ new_v ->
586 returnRn (Just (DeforestSig new_v src_loc))
588 rename_sig (MagicUnfoldingSig v str src_loc)
589 = pushSrcLocRn src_loc $
590 if not (v `elem` binder_occnames) then
591 addErrRn (unknownSigDeclErr "MAGIC_UNFOLDING pragma" v src_loc) `thenRn_`
594 lookupValue v `thenRn` \ new_v ->
595 returnRn (Just (MagicUnfoldingSig new_v str src_loc))
597 not_unbound :: RenamedSig -> Bool
599 not_unbound (Sig n _ _ _) = not (isRnUnbound n)
600 not_unbound (SpecSig n _ _ _) = not (isRnUnbound n)
601 not_unbound (InlineSig n _) = not (isRnUnbound n)
602 not_unbound (DeforestSig n _) = not (isRnUnbound n)
603 not_unbound (MagicUnfoldingSig n _ _) = not (isRnUnbound n)
605 -------------------------------------
606 sig_free :: [RdrNameSig] -> RdrName -> Maybe RdrName
607 -- Return "Just x" if "x" has no type signature in
608 -- sigs. Nothing, otherwise.
610 sig_free [] ny = Just ny
611 sig_free (Sig nx _ _ _ : rest) ny
612 = if (nx == ny) then Nothing else sig_free rest ny
613 sig_free (_ : rest) ny = sig_free rest ny
615 -------------------------------------
616 compare :: RenamedSig -> RenamedSig -> TAG_
617 compare (Sig n1 _ _ _) (Sig n2 _ _ _) = n1 `cmp` n2
618 compare (InlineSig n1 _) (InlineSig n2 _) = n1 `cmp` n2
619 compare (MagicUnfoldingSig n1 _ _) (MagicUnfoldingSig n2 _ _) = n1 `cmp` n2
620 compare (SpecSig n1 ty1 _ _) (SpecSig n2 ty2 _ _)
621 = -- may have many specialisations for one value;
622 -- but not ones that are exactly the same...
623 thenCmp (n1 `cmp` n2) (cmpPolyType cmp ty1 ty2)
625 compare other_1 other_2 -- tags *must* be different
626 = let tag1 = tag other_1
629 if tag1 _LT_ tag2 then LT_ else GT_
631 tag (Sig n1 _ _ _) = (ILIT(1) :: FAST_INT)
632 tag (SpecSig n1 _ _ _) = ILIT(2)
633 tag (InlineSig n1 _) = ILIT(3)
634 tag (MagicUnfoldingSig n1 _ _) = ILIT(4)
635 tag (DeforestSig n1 _) = ILIT(5)
636 tag _ = panic# "tag(RnBinds)"
639 %************************************************************************
641 \subsection{Error messages}
643 %************************************************************************
648 undup_sigs = fst (removeDups cmp_sig sigs)
651 ("more than one "++what_it_is++"\n\thas been given for these variables") ( \ sty ->
652 ppAboves (map (ppr sty) undup_sigs) )
655 = case (head sigs) of
656 Sig _ _ _ loc -> ("type signature",loc)
657 ClassOpSig _ _ _ loc -> ("class-method type signature", loc)
658 SpecSig _ _ _ loc -> ("SPECIALIZE pragma",loc)
659 InlineSig _ loc -> ("INLINE pragma",loc)
660 MagicUnfoldingSig _ _ loc -> ("MAGIC_UNFOLDING pragma",loc)
662 cmp_sig a b = get_name a `cmp` get_name b
664 get_name (Sig n _ _ _) = n
665 get_name (ClassOpSig n _ _ _) = n
666 get_name (SpecSig n _ _ _) = n
667 get_name (InlineSig n _) = n
668 get_name (MagicUnfoldingSig n _ _) = n
670 ------------------------
671 methodBindErr mbind locn
672 = addErrLoc locn "Can't handle multiple methods defined by one pattern binding"
673 (\ sty -> ppr sty mbind)
675 --------------------------
676 missingSigErr locn var
677 = addShortErrLocLine locn ( \ sty ->
678 ppBesides [ppStr "a definition but no type signature for `",
682 --------------------------------
683 unknownSigDeclErr flavor var locn
684 = addShortErrLocLine locn ( \ sty ->
685 ppBesides [ppStr flavor, ppStr " but no definition for `",