[project @ 2003-12-10 14:15:16 by simonmar]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcSimplify.lhs
index 1970ab3..291cf84 100644 (file)
@@ -21,10 +21,8 @@ module TcSimplify (
 
 import {-# SOURCE #-} TcUnify( unifyTauTy )
 import TcEnv           -- temp
-import HsSyn           ( MonoBinds(..), HsExpr(..), andMonoBinds, andMonoBindList )
-import TcHsSyn         ( TcExpr, TcId,
-                         TcMonoBinds, TcDictBinds
-                       )
+import HsSyn           ( HsBind(..), LHsBinds, HsExpr(..), LHsExpr )
+import TcHsSyn         ( TcId, TcDictBinds, mkHsApp, mkHsTyApp, mkHsDictApp )
 
 import TcRnMonad
 import Inst            ( lookupInst, LookupInstResult(..),
@@ -37,11 +35,11 @@ import Inst         ( lookupInst, LookupInstResult(..),
                          newDictsFromOld, tcInstClassOp,
                          getDictClassTys, isTyVarDict,
                          instLoc, zonkInst, tidyInsts, tidyMoreInsts,
-                         Inst, pprInsts, pprInstsInFull,
-                         isIPDict, isInheritableInst
+                         Inst, pprInsts, pprInstsInFull, tcGetInstEnvs,
+                         isIPDict, isInheritableInst, pprDFuns
                        )
-import TcEnv           ( tcGetGlobalTyVars, tcGetInstEnv, tcLookupId, findGlobals )
-import InstEnv         ( lookupInstEnv, classInstEnv, InstLookupResult(..) )
+import TcEnv           ( tcGetGlobalTyVars, tcLookupId, findGlobals )
+import InstEnv         ( lookupInstEnv, classInstEnv )
 import TcMType         ( zonkTcTyVarsAndFV, tcInstTyVars, checkAmbiguity )
 import TcType          ( TcTyVar, TcTyVarSet, ThetaType, TyVarDetails(VanillaTv),
                          mkClassPred, isOverloadedTy, mkTyConApp,
@@ -54,20 +52,20 @@ import NameSet              ( NameSet, mkNameSet, elemNameSet )
 import Class           ( classBigSig, classKey )
 import FunDeps         ( oclose, grow, improve, pprEquationDoc )
 import PrelInfo                ( isNumericClass ) 
-import PrelNames       ( splitName, fstName, sndName, showClassKey, eqClassKey, ordClassKey)
-import HscTypes                ( GhciMode(Interactive) )
-
+import PrelNames       ( splitName, fstName, sndName, integerTyConName,
+                         showClassKey, eqClassKey, ordClassKey )
 import Subst           ( mkTopTyVarSubst, substTheta, substTy )
-import TysWiredIn      ( unitTy, pairTyCon )
+import TysWiredIn      ( pairTyCon, doubleTy )
 import ErrUtils                ( Message )
 import VarSet
 import VarEnv          ( TidyEnv )
 import FiniteMap
+import Bag
 import Outputable
 import ListSetOps      ( equivClasses )
-import Unique          ( hasKey )
 import Util            ( zipEqual, isSingleton )
 import List            ( partition )
+import SrcLoc          ( Located(..) )
 import CmdLineOpts
 \end{code}
 
@@ -593,7 +591,7 @@ inferLoop doc tau_tvs wanteds
        -- the final qtvs might be empty.  See [NO TYVARS] below.
                                
        inferLoop doc tau_tvs (irreds ++ frees) `thenM` \ (qtvs1, frees1, binds1, irreds1) ->
-       returnM (qtvs1, frees1, binds `AndMonoBinds` binds1, irreds1)
+       returnM (qtvs1, frees1, binds `unionBags` binds1, irreds1)
 \end{code}
 
 Example [LOOP]
@@ -729,13 +727,18 @@ tcSimplCheck doc get_qtvs givens wanted_lie
   = check_loop givens wanted_lie       `thenM` \ (qtvs, frees, binds, irreds) ->
 
        -- Complain about any irreducible ones
-    complainCheck doc givens irreds            `thenM_`
+    mappM zonkInst given_dicts_and_ips                         `thenM` \ givens' ->
+    groupErrs (addNoInstanceErrs (Just doc) givens') irreds    `thenM_`
 
        -- Done
-    extendLIEs frees                           `thenM_`
+    extendLIEs frees           `thenM_`
     returnM (qtvs, binds)
 
   where
+    given_dicts_and_ips = filter (not . isMethod) givens
+       -- For error reporting, filter out methods, which are 
+       -- only added to the given set as an optimisation
+
     ip_set = mkNameSet (ipNamesOfInsts givens)
 
     check_loop givens wanteds
@@ -758,7 +761,7 @@ tcSimplCheck doc get_qtvs givens wanted_lie
            returnM (varSetElems qtvs', frees, binds, irreds)
        else
            check_loop givens' (irreds ++ frees)        `thenM` \ (qtvs', frees1, binds1, irreds1) ->
-           returnM (qtvs', frees1, binds `AndMonoBinds` binds1, irreds1)
+           returnM (qtvs', frees1, binds `unionBags` binds1, irreds1)
 \end{code}
 
 
@@ -841,7 +844,7 @@ restrict_loop doc qtvs wanteds
        returnM (varSetElems qtvs', binds)
     else
        restrict_loop doc qtvs' (irreds ++ frees)       `thenM` \ (qtvs1, binds1) ->
-       returnM (qtvs1, binds `AndMonoBinds` binds1)
+       returnM (qtvs1, binds `unionBags` binds1)
 \end{code}
 
 
@@ -974,7 +977,7 @@ tcSimplifyIPs given_ips wanteds
            returnM (frees, binds)
        else
            simpl_loop givens' (irreds ++ frees)        `thenM` \ (frees1, binds1) ->
-           returnM (frees1, binds `AndMonoBinds` binds1)
+           returnM (frees1, binds `unionBags` binds1)
 \end{code}
 
 
@@ -1004,13 +1007,13 @@ For each method @Inst@ in the @init_lie@ that mentions one of the
 @LIE@), as well as the @HsBinds@ generated.
 
 \begin{code}
-bindInstsOfLocalFuns ::        [Inst] -> [TcId] -> TcM TcMonoBinds
+bindInstsOfLocalFuns ::        [Inst] -> [TcId] -> TcM (LHsBinds TcId)
 
 bindInstsOfLocalFuns wanteds local_ids
   | null overloaded_ids
        -- Common case
   = extendLIEs wanteds         `thenM_`
-    returnM EmptyMonoBinds
+    returnM emptyBag
 
   | otherwise
   = simpleReduceLoop doc try_me wanteds                `thenM` \ (frees, binds, irreds) ->
@@ -1081,7 +1084,7 @@ data Avail
                        -- ToDo: remove?
 
   | Rhs                -- Used when there is a RHS
-       TcExpr          -- The RHS
+       (LHsExpr TcId)  -- The RHS
        [Inst]          -- Insts free in the RHS; we need these too
 
   | Linear             -- Splittable Insts only.
@@ -1093,7 +1096,7 @@ data Avail
   | LinRhss            -- Splittable Insts only; this is used only internally
                        --      by extractResults, where a Linear 
                        --      is turned into an LinRhss
-       [TcExpr]        -- A supply of suitable RHSs
+       [LHsExpr TcId]  -- A supply of suitable RHSs
 
 pprAvails avails = vcat [sep [ppr inst, nest 2 (equals <+> pprAvail avail)]
                        | (inst,avail) <- fmToList avails ]
@@ -1121,11 +1124,11 @@ The loop startes
 extractResults :: Avails
               -> [Inst]                -- Wanted
               -> TcM (TcDictBinds,     -- Bindings
-                         [Inst],       -- Irreducible ones
-                         [Inst])       -- Free ones
+                       [Inst],         -- Irreducible ones
+                       [Inst])         -- Free ones
 
 extractResults avails wanteds
-  = go avails EmptyMonoBinds [] [] wanteds
+  = go avails emptyBag [] [] wanteds
   where
     go avails binds irreds frees [] 
       = returnM (binds, irreds, frees)
@@ -1142,7 +1145,7 @@ extractResults avails wanteds
          Just (Given id _) -> go avails new_binds irreds frees ws
                            where
                               new_binds | id == instToId w = binds
-                                        | otherwise        = addBind binds w (HsVar id)
+                                        | otherwise        = addBind binds w (L (instSpan w) (HsVar id))
                -- The sought Id can be one of the givens, via a superclass chain
                -- and then we definitely don't want to generate an x=x binding!
 
@@ -1154,7 +1157,7 @@ extractResults avails wanteds
            -> get_root irreds frees avail w            `thenM` \ (irreds', frees', root_id) ->
               split n (instToId split_inst) root_id w  `thenM` \ (binds', rhss) ->
               go (addToFM avails w (LinRhss rhss))
-                 (binds `AndMonoBinds` binds')
+                 (binds `unionBags` binds')
                  irreds' frees' (split_inst : w : ws)
 
          Just (LinRhss (rhs:rhss))             -- Consume one of the Rhss
@@ -1196,7 +1199,7 @@ extractResults avails wanteds
 
 
 split :: Int -> TcId -> TcId -> Inst 
-      -> TcM (TcDictBinds, [TcExpr])
+      -> TcM (TcDictBinds, [LHsExpr TcId])
 -- (split n split_id root_id wanted) returns
 --     * a list of 'n' expressions, all of which witness 'avail'
 --     * a bunch of auxiliary bindings to support these expressions
@@ -1213,12 +1216,13 @@ split n split_id root_id wanted
     id      = instToId wanted
     occ     = getOccName id
     loc     = getSrcLoc id
+    span    = instSpan wanted
 
-    go 1 = returnM (EmptyMonoBinds, [HsVar root_id])
+    go 1 = returnM (emptyBag, [L span $ HsVar root_id])
 
     go n = go ((n+1) `div` 2)          `thenM` \ (binds1, rhss) ->
           expand n rhss                `thenM` \ (binds2, rhss') ->
-          returnM (binds1 `AndMonoBinds` binds2, rhss')
+          returnM (binds1 `unionBags` binds2, rhss')
 
        -- (expand n rhss) 
        -- Given ((n+1)/2) rhss, make n rhss, using auxiliary bindings
@@ -1231,7 +1235,7 @@ split n split_id root_id wanted
                           returnM (binds', head rhss : rhss')
        where
          go rhss = mapAndUnzipM do_one rhss    `thenM` \ (binds', rhss') ->
-                   returnM (andMonoBindList binds', concat rhss')
+                   returnM (listToBag binds', concat rhss')
 
          do_one rhs = newUnique                        `thenM` \ uniq -> 
                       tcLookupId fstName               `thenM` \ fst_id ->
@@ -1239,14 +1243,16 @@ split n split_id root_id wanted
                       let 
                          x = mkUserLocal occ uniq pair_ty loc
                       in
-                      returnM (VarMonoBind x (mk_app split_id rhs),
-                                   [mk_fs_app fst_id ty x, mk_fs_app snd_id ty x])
+                      returnM (L span (VarBind x (mk_app span split_id rhs)),
+                               [mk_fs_app span fst_id ty x, mk_fs_app span snd_id ty x])
 
-mk_fs_app id ty var = HsVar id `TyApp` [ty,ty] `HsApp` HsVar var
+mk_fs_app span id ty var = L span (HsVar id) `mkHsTyApp` [ty,ty] `mkHsApp` (L span (HsVar var))
 
-mk_app id rhs = HsApp (HsVar id) rhs
+mk_app span id rhs = L span (HsApp (L span (HsVar id)) rhs)
 
-addBind binds inst rhs = binds `AndMonoBinds` VarMonoBind (instToId inst) rhs
+addBind binds inst rhs = binds `unionBags` unitBag (L (instLocSrcSpan (instLoc inst)) 
+                                                     (VarBind (instToId inst) rhs))
+instSpan wanted = instLocSrcSpan (instLoc wanted)
 \end{code}
 
 
@@ -1277,7 +1283,7 @@ simpleReduceLoop doc try_me wanteds
        returnM (frees, binds, irreds)
     else
        simpleReduceLoop doc try_me (irreds ++ frees)   `thenM` \ (frees1, binds1, irreds1) ->
-       returnM (frees1, binds `AndMonoBinds` binds1, irreds1)
+       returnM (frees1, binds `unionBags` binds1, irreds1)
 \end{code}
 
 
@@ -1328,8 +1334,10 @@ reduceContext doc try_me givens wanteds
 
     returnM (no_improvement, frees, binds, irreds)
 
+tcImprove :: Avails -> TcM Bool                -- False <=> no change
+-- Perform improvement using all the predicates in Avails
 tcImprove avails
- =  tcGetInstEnv                               `thenM` \ inst_env ->
+ =  tcGetInstEnvs                      `thenM` \ (home_ie, pkg_ie) ->
     let
        preds = [ (pred, pp_loc)
                | inst <- keysFM avails,
@@ -1341,7 +1349,8 @@ tcImprove avails
                -- It does not have duplicates (good)
                -- NB that (?x::t1) and (?x::t2) will be held separately in avails
                --    so that improve will see them separate
-       eqns  = improve (classInstEnv inst_env) preds
+       eqns = improve get_insts preds
+       get_insts clas = classInstEnv home_ie clas ++ classInstEnv pkg_ie clas
      in
      if null eqns then
        returnM True
@@ -1501,7 +1510,7 @@ addFree :: Avails -> Inst -> TcM Avails
        --
 addFree avails free = returnM (addToFM avails free IsFree)
 
-addWanted :: Avails -> Inst -> TcExpr -> [Inst] -> TcM Avails
+addWanted :: Avails -> Inst -> LHsExpr TcId -> [Inst] -> TcM Avails
 addWanted avails wanted rhs_expr wanteds
   = ASSERT2( not (wanted `elemFM` avails), ppr wanted $$ ppr avails )
     addAvailAndSCs avails wanted avail
@@ -1523,7 +1532,8 @@ addIrred AddSCs avails irred = ASSERT2( not (irred `elemFM` avails), ppr irred $
 addAvailAndSCs :: Avails -> Inst -> Avail -> TcM Avails
 addAvailAndSCs avails inst avail
   | not (isClassDict inst) = returnM avails1
-  | otherwise             = addSCs is_loop avails1 inst 
+  | otherwise             = traceTc (text "addAvailAndSCs" <+> vcat [ppr inst, ppr deps]) `thenM_`
+                            addSCs is_loop avails1 inst 
   where
     avails1 = addToFM avails inst avail
     is_loop inst = inst `elem` deps    -- Note: this compares by *type*, not by Unique
@@ -1556,15 +1566,15 @@ addSCs is_loop avails dict
     sc_theta' = substTheta (mkTopTyVarSubst tyvars tys) sc_theta
 
     add_sc avails (sc_dict, sc_sel)    -- Add it, and its superclasses
+      | is_loop sc_dict
+      = returnM avails -- See Note [SUPERCLASS-LOOP]
+      | otherwise
       = case lookupFM avails sc_dict of
-         Just (Given _ _) -> returnM avails    -- Given is cheaper than
-                                                       --   a superclass selection
-         Just other | is_loop sc_dict -> returnM avails        -- See Note [SUPERCLASS-LOOP]
-                    | otherwise       -> returnM avails'       -- SCs already added
-
-         Nothing -> addSCs is_loop avails' sc_dict
+         Just (Given _ _) -> returnM avails    -- Given is cheaper than superclass selection
+         Just other       -> returnM avails'   -- SCs already added
+         Nothing          -> addSCs is_loop avails' sc_dict
       where
-       sc_sel_rhs = DictApp (TyApp (HsVar sc_sel) tys) [instToId dict]
+       sc_sel_rhs = mkHsDictApp (mkHsTyApp (L (instSpan dict) (HsVar sc_sel)) tys) [instToId dict]
        avail      = Rhs sc_sel_rhs [dict]
        avails'    = addToFM avails sc_dict avail
 \end{code}
@@ -1582,6 +1592,14 @@ superclasses of C [a] to avails.  But we must not overwrite the binding
 for d1:Ord a (which is given) with a superclass selection or we'll just
 build a loop! 
 
+Here's another variant, immortalised in tcrun020
+       class Monad m => C1 m
+       class C1 m => C2 m x
+       instance C2 Maybe Bool
+For the instance decl we need to build (C1 Maybe), and it's no good if
+we run around and add (C2 Maybe Bool) and its superclasses to the avails 
+before we search for C1 Maybe.
+
 Here's another example 
        class Eq b => Foo a b
        instance Eq a => Foo [a] a
@@ -1689,8 +1707,7 @@ tc_simplify_top is_interactive wanteds
 
                -- Collect together all the bad guys
        bad_guys               = non_stds ++ concat std_bads
-       (tidy_env, tidy_dicts) = tidyInsts bad_guys
-       (bad_ips, non_ips)     = partition isIPDict tidy_dicts
+       (bad_ips, non_ips)     = partition isIPDict bad_guys
        (no_insts, ambigs)     = partition no_inst non_ips
        no_inst d              = not (isTyVarDict d) 
        -- Previously, there was a more elaborate no_inst definition:
@@ -1701,8 +1718,8 @@ tc_simplify_top is_interactive wanteds
     in
 
        -- Report definite errors
-    addTopInstanceErrs tidy_env no_insts       `thenM_`
-    addTopIPErrs tidy_env bad_ips              `thenM_`
+    groupErrs (addNoInstanceErrs Nothing []) no_insts  `thenM_`
+    addTopIPErrs bad_ips                               `thenM_`
 
        -- Deal with ambiguity errors, but only if
        -- if there has not been an error so far; errors often
@@ -1715,13 +1732,13 @@ tc_simplify_top is_interactive wanteds
        --      e.g. Num (IO a) and Eq (Int -> Int)
        -- and ambiguous dictionaries
        --      e.g. Num a
-       addTopAmbigErrs (tidy_env, ambigs)      `thenM_`
+       addTopAmbigErrs ambigs          `thenM_`
 
        -- Disambiguate the ones that look feasible
         mappM (disambigGroup is_interactive) std_oks
     )                                  `thenM` \ binds_ambig ->
 
-    returnM (binds `andMonoBinds` andMonoBindList binds_ambig)
+    returnM (binds `unionBags` unionManyBags binds_ambig)
 
 ----------------------------------
 d1 `cmp_by_tyvar` d2 = get_tv d1 `compare` get_tv d2
@@ -1778,7 +1795,7 @@ disambigGroup is_interactive dicts
        -- default list which can satisfy all the ambiguous classes.
        -- For example, if Real a is reqd, but the only type in the
        -- default list is Int.
-    getDefaultTys                      `thenM` \ default_tys ->
+    get_default_tys                    `thenM` \ default_tys ->
     let
       try_default []   -- No defaults work, so fail
        = failM
@@ -1821,8 +1838,17 @@ disambigGroup is_interactive dicts
        warnDefault dicts default_ty                    `thenM_`
        returnM binds
 
-    bomb_out = addTopAmbigErrs (tidyInsts dicts)       `thenM_`
-              returnM EmptyMonoBinds
+    bomb_out = addTopAmbigErrs dicts   `thenM_`
+              returnM emptyBag
+
+get_default_tys
+  = do         { mb_defaults <- getDefaultTys
+       ; case mb_defaults of
+               Just tys -> return tys
+               Nothing  ->     -- No use-supplied default;
+                               -- use [Integer, Double]
+                           do { integer_ty <- tcMetaTy integerTyConName
+                              ; return [integer_ty, doubleTy] } }
 \end{code}
 
 [Aside - why the defaulting mechanism is turned off when
@@ -1995,35 +2021,105 @@ addInstLoc insts msg = msg $$ nest 2 (pprInstLoc (instLoc (head insts)))
 plural [x] = empty
 plural xs  = char 's'
 
-
-addTopIPErrs tidy_env tidy_dicts
+addTopIPErrs dicts
   = groupErrs report tidy_dicts
   where
+    (tidy_env, tidy_dicts) = tidyInsts dicts
     report dicts = addErrTcM (tidy_env, mk_msg dicts)
     mk_msg dicts = addInstLoc dicts (ptext SLIT("Unbound implicit parameter") <> 
                                     plural tidy_dicts <+> pprInsts tidy_dicts)
 
--- Used for top-level irreducibles
-addTopInstanceErrs tidy_env tidy_dicts
-  = groupErrs report tidy_dicts
+addNoInstanceErrs :: Maybe SDoc        -- Nothing => top level
+                               -- Just d => d describes the construct
+                 -> [Inst]     -- What is given by the context or type sig
+                 -> [Inst]     -- What is wanted
+                 -> TcM ()     
+addNoInstanceErrs mb_what givens [] 
+  = returnM ()
+addNoInstanceErrs mb_what givens dicts
+  =    -- Some of the dicts are here because there is no instances
+       -- and some because there are too many instances (overlap)
+       -- The first thing we do is separate them
+    getDOpts           `thenM` \ dflags ->
+    tcGetInstEnvs      `thenM` \ inst_envs ->
+    let
+       (tidy_env1, tidy_givens) = tidyInsts givens
+       (tidy_env2, tidy_dicts)  = tidyMoreInsts tidy_env1 dicts
+
+       -- Run through the dicts, generating a message for each
+       -- overlapping one, but simply accumulating all the 
+       -- no-instance ones so they can be reported as a group
+       (overlap_doc, no_inst_dicts) = foldl check_overlap (empty, []) tidy_dicts
+       check_overlap (overlap_doc, no_inst_dicts) dict 
+         | not (isClassDict dict) = (overlap_doc, dict : no_inst_dicts)
+         | otherwise
+         = case lookupInstEnv dflags inst_envs clas tys of
+               res@(ms, _) 
+                 | length ms > 1 -> (mk_overlap_msg dict res $$ overlap_doc, no_inst_dicts)
+                 | otherwise     -> (overlap_doc, dict : no_inst_dicts)        -- No match
+               -- NB: there can be exactly one match, in the case where we have
+               --      instance C a where ...
+               -- (In this case, lookupInst doesn't bother to look up, 
+               --  unless -fallow-undecidable-instances is set.)
+               -- So we report this as "no instance" rather than "overlap"; the fix is
+               -- to specify -fallow-undecidable-instances, but we leave that to the programmer!
+         where
+           (clas,tys) = getDictClassTys dict
+    in
+    mk_probable_fix tidy_env2 mb_what no_inst_dicts    `thenM` \ (tidy_env3, probable_fix) ->
+    let
+       no_inst_doc | null no_inst_dicts = empty
+                   | otherwise = vcat [addInstLoc no_inst_dicts heading, probable_fix]
+       heading | null givens = ptext SLIT("No instance") <> plural no_inst_dicts <+> 
+                               ptext SLIT("for") <+> pprInsts no_inst_dicts
+               | otherwise   = sep [ptext SLIT("Could not deduce") <+> pprInsts no_inst_dicts,
+                                    nest 2 $ ptext SLIT("from the context") <+> pprInsts tidy_givens]
+    in
+    addErrTcM (tidy_env3, no_inst_doc $$ overlap_doc)
   where
-    report dicts = mkMonomorphismMsg tidy_env dicts    `thenM` \ (tidy_env, mono_msg) ->
-                  addErrTcM (tidy_env, mk_msg dicts $$ mono_msg)
-    mk_msg dicts = addInstLoc dicts (ptext SLIT("No instance") <> plural tidy_dicts <+> 
-                                    ptext SLIT("for") <+> pprInsts tidy_dicts)
-                  
+    mk_overlap_msg dict (matches, unifiers)
+      = vcat [ addInstLoc [dict] ((ptext SLIT("Overlapping instances for") <+> ppr dict)),
+               sep [ptext SLIT("Matching instances") <> colon,
+                    nest 2 (pprDFuns (dfuns ++ unifiers))],
+               if null unifiers 
+               then empty
+               else parens (ptext SLIT("The choice depends on the instantiation of") <+>
+                            quotes (pprWithCommas ppr (varSetElems (tyVarsOfInst dict))))]
+      where
+       dfuns = [df | (_, (_,_,df)) <- matches]
 
-addTopAmbigErrs (tidy_env, tidy_dicts)
+    mk_probable_fix tidy_env Nothing dicts     -- Top level
+      = mkMonomorphismMsg tidy_env dicts
+    mk_probable_fix tidy_env (Just what) dicts -- Nested (type signatures, instance decls)
+      = returnM (tidy_env, sep [ptext SLIT("Probable fix:"), nest 2 fix1, nest 2 fix2])
+      where
+       fix1 = sep [ptext SLIT("Add") <+> pprInsts dicts,
+                   ptext SLIT("to the") <+> what]
+
+       fix2 | null instance_dicts = empty
+            | otherwise           = ptext SLIT("Or add an instance declaration for")
+                                    <+> pprInsts instance_dicts
+       instance_dicts = [d | d <- dicts, isClassDict d, not (isTyVarDict d)]
+               -- Insts for which it is worth suggesting an adding an instance declaration
+               -- Exclude implicit parameters, and tyvar dicts
+
+
+addTopAmbigErrs dicts
 -- Divide into groups that share a common set of ambiguous tyvars
   = mapM report (equivClasses cmp [(d, tvs_of d) | d <- tidy_dicts])
   where
+    (tidy_env, tidy_dicts) = tidyInsts dicts
+
     tvs_of :: Inst -> [TcTyVar]
     tvs_of d = varSetElems (tyVarsOfInst d)
     cmp (_,tvs1) (_,tvs2) = tvs1 `compare` tvs2
     
     report :: [(Inst,[TcTyVar])] -> TcM ()
-    report pairs@((_,tvs) : _) -- The pairs share a common set of ambiguous tyvars
+    report pairs@((inst,tvs) : _)      -- The pairs share a common set of ambiguous tyvars
        = mkMonomorphismMsg tidy_env dicts      `thenM` \ (tidy_env, mono_msg) ->
+         addSrcSpan (instLocSrcSpan (instLoc inst)) $
+               -- the location of the first one will do for the err message
          addErrTcM (tidy_env, msg $$ mono_msg)
        where
          dicts = map fst pairs
@@ -2066,72 +2162,6 @@ warnDefault dicts default_ty
                                quotes (ppr default_ty),
                      pprInstsInFull tidy_dicts]
 
-complainCheck doc givens irreds
-  = mappM zonkInst given_dicts_and_ips                 `thenM` \ givens' ->
-    groupErrs (addNoInstanceErrs doc givens') irreds   `thenM_`
-    returnM ()
-  where
-    given_dicts_and_ips = filter (not . isMethod) givens
-       -- Filter out methods, which are only added to
-       -- the given set as an optimisation
-
-addNoInstanceErrs what_doc givens dicts
-  = getDOpts           `thenM` \ dflags ->
-    tcGetInstEnv       `thenM` \ inst_env ->
-    let
-       (tidy_env1, tidy_givens) = tidyInsts givens
-       (tidy_env2, tidy_dicts)  = tidyMoreInsts tidy_env1 dicts
-
-       doc = vcat [addInstLoc dicts $
-                   sep [herald <+> pprInsts tidy_dicts,
-                        nest 4 $ ptext SLIT("from the context") <+> pprInsts tidy_givens],
-                   ambig_doc,
-                   ptext SLIT("Probable fix:"),
-                   nest 4 fix1,
-                   nest 4 fix2]
-
-       herald = ptext SLIT("Could not") <+> unambig_doc <+> ptext SLIT("deduce")
-       unambig_doc | ambig_overlap = ptext SLIT("unambiguously")
-                   | otherwise     = empty
-
-               -- The error message when we don't find a suitable instance
-               -- is complicated by the fact that sometimes this is because
-               -- there is no instance, and sometimes it's because there are
-               -- too many instances (overlap).  See the comments in TcEnv.lhs
-               -- with the InstEnv stuff.
-
-       ambig_doc
-           | not ambig_overlap = empty
-           | otherwise
-           = vcat [ptext SLIT("The choice of (overlapping) instance declaration"),
-                   nest 4 (ptext SLIT("depends on the instantiation of") <+>
-                           quotes (pprWithCommas ppr (varSetElems (tyVarsOfInsts tidy_dicts))))]
-
-       fix1 = sep [ptext SLIT("Add") <+> pprInsts tidy_dicts,
-                   ptext SLIT("to the") <+> what_doc]
-
-       fix2 | null instance_dicts 
-            = empty
-            | otherwise
-            = ptext SLIT("Or add an instance declaration for") <+> pprInsts instance_dicts
-
-       instance_dicts = [d | d <- tidy_dicts, isClassDict d, not (isTyVarDict d)]
-               -- Insts for which it is worth suggesting an adding an instance declaration
-               -- Exclude implicit parameters, and tyvar dicts
-
-           -- Checks for the ambiguous case when we have overlapping instances
-       ambig_overlap = any ambig_overlap1 dicts
-       ambig_overlap1 dict 
-               | isClassDict dict
-               = case lookupInstEnv dflags inst_env clas tys of
-                           NoMatch ambig -> ambig
-                           other         -> False
-               | otherwise = False
-               where
-                 (clas,tys) = getDictClassTys dict
-    in
-    addErrTcM (tidy_env2, doc)
-
 -- Used for the ...Thetas variants; all top level
 noInstErr pred = ptext SLIT("No instance for") <+> quotes (ppr pred)