summaryrefslogtreecommitdiff
path: root/compiler/GHC/Tc/Errors.hs
diff options
context:
space:
mode:
authorZiyang Liu <unsafeFixIO@gmail.com>2021-10-19 12:39:58 -0700
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-10-29 05:01:50 -0400
commit522eab3f056905db47110c73dac1833f4a2880f2 (patch)
tree2d9989fa00bf090d3b034ee6d272a5057aadc109 /compiler/GHC/Tc/Errors.hs
parent638f65482ca5265c268aa97abfcc14cdc27e46ba (diff)
downloadhaskell-522eab3f056905db47110c73dac1833f4a2880f2.tar.gz
Show family TyCons in mk_dict_error in the case of a single match
Diffstat (limited to 'compiler/GHC/Tc/Errors.hs')
-rw-r--r--compiler/GHC/Tc/Errors.hs28
1 files changed, 26 insertions, 2 deletions
diff --git a/compiler/GHC/Tc/Errors.hs b/compiler/GHC/Tc/Errors.hs
index ff6525f24d..7177f7347f 100644
--- a/compiler/GHC/Tc/Errors.hs
+++ b/compiler/GHC/Tc/Errors.hs
@@ -46,6 +46,7 @@ import GHC.Types.Name.Set
import GHC.Types.SrcLoc
import GHC.Types.Basic
import GHC.Types.Error
+import GHC.Types.Unique.Set ( nonDetEltsUniqSet )
import GHC.Rename.Unbound ( unknownNameSuggestions, WhatLooking(..) )
import GHC.Unit.Module
@@ -2491,6 +2492,17 @@ mkDictErr ctxt cts
-- but we really only want to report the latter
elim_superclasses cts = mkMinimalBySCs ctPred cts
+-- [Note: mk_dict_err]
+-- ~~~~~~~~~~~~~~~~~~~
+-- Different dictionary error messages are reported depending on the number of
+-- matches and unifiers:
+--
+-- - No matches, regardless of unifiers: report "No instance for ...".
+-- - Two or more matches, regardless of unifiers: report "Overlapping instances for ...",
+-- and show the matching and unifying instances.
+-- - One match, one or more unifiers: report "Overlapping instances for", show the
+-- matching and unifying instances, and say "The choice depends on the instantion of ...,
+-- and the result of evaluating ...".
mk_dict_err :: HasCallStack => ReportErrCtxt -> (Ct, ClsInstLookupResult)
-> TcM SDoc
-- Report an overlap error if this class constraint results
@@ -2680,12 +2692,24 @@ mk_dict_err ctxt@(CEC {cec_encl = implics}) (ct, (matches, unifiers, unsafe_over
, nest 2 (vcat (pp_givens useful_givens))]
, ppWhen (isSingleton matches) $
- parens (vcat [ text "The choice depends on the instantiation of" <+>
- quotes (pprWithCommas ppr (tyCoVarsOfTypesList tys))
+ parens (vcat [ ppUnless (null tyCoVars) $
+ text "The choice depends on the instantiation of" <+>
+ quotes (pprWithCommas ppr tyCoVars)
+ , ppUnless (null famTyCons) $
+ if (null tyCoVars)
+ then
+ text "The choice depends on the result of evaluating" <+>
+ quotes (pprWithCommas ppr famTyCons)
+ else
+ text "and the result of evaluating" <+>
+ quotes (pprWithCommas ppr famTyCons)
, ppWhen (null (matching_givens)) $
vcat [ text "To pick the first instance above, use IncoherentInstances"
, text "when compiling the other instance declarations"]
])]
+ where
+ tyCoVars = tyCoVarsOfTypesList tys
+ famTyCons = filter isFamilyTyCon $ concatMap (nonDetEltsUniqSet . tyConsOfType) tys
matching_givens = mapMaybe matchable useful_givens