Fix inconsistent pretty-printing of type families
authorMichał Sośnicki <sosnicki.michal@gmail.com>
Wed, 18 Nov 2015 15:02:53 +0000 (16:02 +0100)
committerBen Gamari <ben@smart-cactus.org>
Wed, 18 Nov 2015 16:31:20 +0000 (17:31 +0100)
After the changes, the three functions used to print type families
were identical, so they are refactored into one.

Original RHSs of data instance declarations are recreated and
printed in user error messages.

RHSs containing representation TyCons are printed in the
Coercion Axioms section in a typechecker dump.

Add vbar to the list of SDocs exported by Outputable.
Replace all text "|" docs with it.

Fixes #10839

Reviewers: goldfire, jstolarek, austin, bgamari

Reviewed By: jstolarek

Subscribers: jstolarek, thomie

Differential Revision: https://phabricator.haskell.org/D1441

GHC Trac Issues: #10839

47 files changed:
compiler/basicTypes/DataCon.hs-boot
compiler/coreSyn/CoreLint.hs
compiler/deSugar/DsUtils.hs
compiler/hsSyn/HsDecls.hs
compiler/hsSyn/HsExpr.hs
compiler/iface/IfaceSyn.hs
compiler/iface/LoadIface.hs
compiler/nativeGen/Reg.hs
compiler/nativeGen/SPARC/Ppr.hs
compiler/typecheck/FamInst.hs
compiler/typecheck/TcInstDcls.hs
compiler/typecheck/TcValidity.hs
compiler/types/Class.hs
compiler/types/Coercion.hs
compiler/types/TypeRep.hs
compiler/utils/BooleanFormula.hs
compiler/utils/Outputable.hs
compiler/utils/Pretty.hs
testsuite/tests/ghci/scripts/T6018ghcifail.stderr
testsuite/tests/indexed-types/should_compile/T3017.stderr
testsuite/tests/indexed-types/should_compile/T9085.stderr
testsuite/tests/indexed-types/should_fail/NoGood.stderr
testsuite/tests/indexed-types/should_fail/Over.stderr
testsuite/tests/indexed-types/should_fail/SimpleFail11a.stderr
testsuite/tests/indexed-types/should_fail/SimpleFail11b.stderr
testsuite/tests/indexed-types/should_fail/SimpleFail11c.stderr
testsuite/tests/indexed-types/should_fail/SimpleFail11d.stderr
testsuite/tests/indexed-types/should_fail/SimpleFail2b.stderr
testsuite/tests/indexed-types/should_fail/T2334A.stderr
testsuite/tests/indexed-types/should_fail/T2677.stderr
testsuite/tests/indexed-types/should_fail/T3330b.stderr
testsuite/tests/indexed-types/should_fail/T4246.stderr
testsuite/tests/indexed-types/should_fail/T9371.stderr
testsuite/tests/partial-sigs/should_compile/DataFamilyInstanceLHS.stderr
testsuite/tests/partial-sigs/should_compile/TypeFamilyInstanceLHS.stderr
testsuite/tests/polykinds/T7524.stderr
testsuite/tests/roles/should_compile/Roles14.stderr
testsuite/tests/roles/should_compile/Roles3.stderr
testsuite/tests/roles/should_compile/Roles4.stderr
testsuite/tests/roles/should_compile/T8958.stderr
testsuite/tests/th/T6018th.stderr
testsuite/tests/typecheck/should_compile/T6018.stderr
testsuite/tests/typecheck/should_compile/tc231.stderr
testsuite/tests/typecheck/should_compile/tc265.stderr
testsuite/tests/typecheck/should_fail/T10836.stderr
testsuite/tests/typecheck/should_fail/T6018fail.stderr
testsuite/tests/typecheck/should_fail/T6018failclosed.stderr

index ca20788..615ef53 100644 (file)
@@ -17,6 +17,8 @@ dataConSourceArity  :: DataCon -> Arity
 dataConFieldLabels :: DataCon -> [FieldLabel]
 dataConInstOrigArgTys  :: DataCon -> [Type] -> [Type]
 dataConStupidTheta :: DataCon -> ThetaType
+dataConFullSig :: DataCon
+               -> ([TyVar], [TyVar], [(TyVar,Type)], ThetaType, [Type], Type)
 
 instance Eq DataCon
 instance Ord DataCon
index 00a7fd0..d9116a6 100644 (file)
@@ -1350,13 +1350,13 @@ lintCoercion (InstCo co arg_ty)
 
 lintCoercion co@(AxiomInstCo con ind cos)
   = do { unless (0 <= ind && ind < numBranches (coAxiomBranches con))
-                (bad_ax (ptext (sLit "index out of range")))
+                (bad_ax (text "index out of range"))
          -- See Note [Kind instantiation in coercions]
        ; let CoAxBranch { cab_tvs   = ktvs
                         , cab_roles = roles
                         , cab_lhs   = lhs
                         , cab_rhs   = rhs } = coAxiomNthBranch con ind
-       ; unless (equalLength ktvs cos) (bad_ax (ptext (sLit "lengths")))
+       ; unless (equalLength ktvs cos) (bad_ax (text "lengths"))
        ; in_scope <- getInScope
        ; let empty_subst = mkTvSubst in_scope emptyTvSubstEnv
        ; (subst_l, subst_r) <- foldlM check_ki
@@ -1365,11 +1365,12 @@ lintCoercion co@(AxiomInstCo con ind cos)
        ; let lhs' = Type.substTys subst_l lhs
              rhs' = Type.substTy subst_r rhs
        ; case checkAxInstCo co of
-           Just bad_branch -> bad_ax $ ptext (sLit "inconsistent with") <+> (pprCoAxBranch (coAxiomTyCon con) bad_branch)
+           Just bad_branch -> bad_ax $ text "inconsistent with" <+>
+                                       pprCoAxBranch con bad_branch
            Nothing -> return ()
        ; return (typeKind rhs', mkTyConApp (coAxiomTyCon con) lhs', rhs', coAxiomRole con) }
   where
-    bad_ax what = addErrL (hang (ptext (sLit "Bad axiom application") <+> parens what)
+    bad_ax what = addErrL (hang (text  "Bad axiom application" <+> parens what)
                         2 (ppr co))
 
     check_ki (subst_l, subst_r) (ktv, role, co)
@@ -1379,7 +1380,8 @@ lintCoercion co@(AxiomInstCo con ind cos)
                   -- Using subst_l is ok, because subst_l and subst_r
                   -- must agree on kind equalities
            ; unless (k `isSubKind` ktv_kind)
-                    (bad_ax (ptext (sLit "check_ki2") <+> vcat [ ppr co, ppr k, ppr ktv, ppr ktv_kind ] ))
+                    (bad_ax (text "check_ki2" <+>
+                             vcat [ ppr co, ppr k, ppr ktv, ppr ktv_kind ] ))
            ; return (Type.extendTvSubst subst_l ktv t1,
                      Type.extendTvSubst subst_r ktv t2) }
 
index a14c608..98f7f0f 100644 (file)
@@ -463,7 +463,7 @@ mkErrorAppDs err_id ty msg = do
     src_loc <- getSrcSpanDs
     dflags <- getDynFlags
     let
-        full_msg = showSDoc dflags (hcat [ppr src_loc, text "|", msg])
+        full_msg = showSDoc dflags (hcat [ppr src_loc, vbar, msg])
         core_msg = Lit (mkMachString full_msg)
         -- mkMachString returns a result of type String#
     return (mkApps (Var err_id) [Type ty, core_msg])
index ec46d0e..91c04fa 100644 (file)
@@ -906,7 +906,7 @@ pprFamilyDecl top_level (FamilyDecl { fdInfo = info, fdLName = ltycon
                 TyVarSig tv_bndr -> text "=" <+> ppr tv_bndr
     pp_inj = case mb_inj of
                Just (L _ (InjectivityAnn lhs rhs)) ->
-                 hsep [ text "|", ppr lhs, text "->", hsep (map ppr rhs) ]
+                 hsep [ vbar, ppr lhs, text "->", hsep (map ppr rhs) ]
                Nothing -> empty
     (pp_where, pp_eqns) = case info of
       ClosedTypeFamily mb_eqns ->
index d02f2d5..e688d18 100644 (file)
@@ -713,7 +713,7 @@ ppr_expr (HsIf _ e1 e2 e3)
 ppr_expr (HsMultiIf _ alts)
   = sep $ ptext (sLit "if") : map ppr_alt alts
   where ppr_alt (L _ (GRHS guards expr)) =
-          sep [ char '|' <+> interpp'SP guards
+          sep [ vbar <+> interpp'SP guards
               , ptext (sLit "->") <+> pprDeeper (ppr expr) ]
 
 -- special case: let ... in let ...
@@ -1283,7 +1283,7 @@ pprGRHS ctxt (GRHS [] body)
  =  pp_rhs ctxt body
 
 pprGRHS ctxt (GRHS guards body)
- = sep [char '|' <+> interpp'SP guards, pp_rhs ctxt body]
+ = sep [vbar <+> interpp'SP guards, pp_rhs ctxt body]
 
 pp_rhs :: Outputable body => HsMatchContext idL -> body -> SDoc
 pp_rhs ctxt rhs = matchSeparator ctxt <+> pprDeeper (ppr rhs)
@@ -1707,7 +1707,7 @@ pprComp :: (OutputableBndr id, Outputable body)
 pprComp quals     -- Prints:  body | qual1, ..., qualn
   | not (null quals)
   , L _ (LastStmt body _ _) <- last quals
-  = hang (ppr body <+> char '|') 2 (pprQuals (dropTail 1 quals))
+  = hang (ppr body <+> vbar) 2 (pprQuals (dropTail 1 quals))
   | otherwise
   = pprPanic "pprComp" (pprQuals quals)
 
@@ -1842,7 +1842,7 @@ pprSplice (HsQuasiQuote n q _ s) = ppr_quasi n q s
 
 ppr_quasi :: OutputableBndr id => id -> id -> FastString -> SDoc
 ppr_quasi n quoter quote = ifPprDebug (brackets (ppr n)) <>
-                           char '[' <> ppr quoter <> ptext (sLit "|") <>
+                           char '[' <> ppr quoter <> vbar <>
                            ppr quote <> ptext (sLit "|]")
 
 ppr_splice :: OutputableBndr id => SDoc -> id -> LHsExpr id -> SDoc
@@ -1888,7 +1888,7 @@ pprHsBracket (VarBr False n) = ptext (sLit "''") <> ppr n
 pprHsBracket (TExpBr e)  = thTyBrackets (ppr e)
 
 thBrackets :: SDoc -> SDoc -> SDoc
-thBrackets pp_kind pp_body = char '[' <> pp_kind <> char '|' <+>
+thBrackets pp_kind pp_body = char '[' <> pp_kind <> vbar <+>
                              pp_body <+> ptext (sLit "|]")
 
 thTyBrackets :: SDoc -> SDoc
index 3911786..41d6779 100644 (file)
@@ -643,7 +643,7 @@ pprIfaceDecl ss (IfaceData { ifName = tycon, ifCType = ctype,
             -- See discussion on Trac #8672.
 
     add_bars []     = Outputable.empty
-    add_bars (c:cs) = sep ((equals <+> c) : map (char '|' <+>) cs)
+    add_bars (c:cs) = sep ((equals <+> c) : map (vbar <+>) cs)
 
     ok_con dc = showSub ss dc || any (showSub ss) (ifConFields dc)
 
@@ -741,7 +741,7 @@ pprIfaceDecl ss (IfaceFamily { ifName = tycon, ifTyVars = tyvars
 
     pp_inj_cond res inj = case filterByList inj tyvars of
        []  -> empty
-       tvs -> hsep [text "|", ppr res, text "->", interppSP (map fst tvs)]
+       tvs -> hsep [vbar, ppr res, text "->", interppSP (map fst tvs)]
 
     pp_rhs IfaceDataFamilyTyCon
       = ppShowIface ss (ptext (sLit "data"))
index 48acd8d..f4a6a3d 100644 (file)
@@ -910,9 +910,10 @@ When printing export lists, we print like this:
 pprExport :: IfaceExport -> SDoc
 pprExport (Avail _ n)         = ppr n
 pprExport (AvailTC _ [] []) = Outputable.empty
-pprExport (AvailTC n ns0 fs) = case ns0 of
-                                 (n':ns) | n==n' -> ppr n <> pp_export ns fs
-                                 _               -> ppr n <> char '|' <> pp_export ns0 fs
+pprExport (AvailTC n ns0 fs)
+  = case ns0 of
+      (n':ns) | n==n' -> ppr n <> pp_export ns fs
+      _               -> ppr n <> vbar <> pp_export ns0 fs
   where
     pp_export []    [] = Outputable.empty
     pp_export names fs = braces (hsep (map ppr names ++ map (ppr . flLabel) fs))
index 862306f..e8d0187 100644 (file)
@@ -135,8 +135,9 @@ instance Uniquable RealReg where
 instance Outputable RealReg where
         ppr reg
          = case reg of
-                RealRegSingle i         -> text "%r"    <> int i
-                RealRegPair r1 r2       -> text "%r(" <> int r1 <> text "|" <> int r2 <> text ")"
+                RealRegSingle i         -> text "%r"  <> int i
+                RealRegPair r1 r2       -> text "%r(" <> int r1
+                                           <> vbar <> int r2 <> text ")"
 
 regNosOfRealReg :: RealReg -> [RegNo]
 regNosOfRealReg rr
index 93beabe..eac88f8 100644 (file)
@@ -161,7 +161,7 @@ pprReg reg
 
                 RealRegPair r1 r2
                  -> text "(" <> pprReg_ofRegNo r1
-                 <> text "|" <> pprReg_ofRegNo r2
+                 <> vbar     <> pprReg_ofRegNo r2
                  <> text ")"
 
 
index 7023a4c..93de504 100644 (file)
@@ -402,10 +402,10 @@ checkForInjectivityConflicts instEnvs famInst
     | isTypeFamilyTyCon tycon
     -- type family is injective in at least one argument
     , Injective inj <- familyTyConInjectivityInfo tycon = do
-    { let axiom = coAxiomSingleBranch (fi_axiom famInst)
+    { let axiom = coAxiomSingleBranch fi_ax
           conflicts = lookupFamInstEnvInjectivityConflicts inj instEnvs famInst
           -- see Note [Verifying injectivity annotation] in FamInstEnv
-          errs = makeInjectivityErrors tycon axiom inj conflicts
+          errs = makeInjectivityErrors fi_ax axiom inj conflicts
     ; mapM_ (\(err, span) -> setSrcSpan span $ addErr err) errs
     ; return (null errs)
     }
@@ -414,15 +414,16 @@ checkForInjectivityConflicts instEnvs famInst
     -- type family we report no conflicts
     | otherwise = return True
     where tycon = famInstTyCon famInst
+          fi_ax = fi_axiom famInst
 
 -- | Build a list of injectivity errors together with their source locations.
 makeInjectivityErrors
-   :: TyCon        -- ^ Type family tycon for which we generate errors
+   :: CoAxiom br   -- ^ Type family for which we generate errors
    -> CoAxBranch   -- ^ Currently checked equation (represented by axiom)
    -> [Bool]       -- ^ Injectivity annotation
    -> [CoAxBranch] -- ^ List of injectivity conflicts
    -> [(SDoc, SrcSpan)]
-makeInjectivityErrors tycon axiom inj conflicts
+makeInjectivityErrors fi_ax axiom inj conflicts
   = ASSERT2( any id inj, text "No injective type variables" )
     let lhs             = coAxBranchLHS axiom
         rhs             = coAxBranchRHS axiom
@@ -435,7 +436,8 @@ makeInjectivityErrors tycon axiom inj conflicts
         wrong_bare_rhs  = not $ null bare_variables
 
         err_builder herald eqns
-                        = ( herald $$ vcat (map (pprCoAxBranch tycon) eqns)
+                        = ( hang herald
+                               2 (vcat (map (pprCoAxBranch fi_ax) eqns))
                           , coAxBranchSpan (head eqns) )
         errorIf p f     = if p then [f err_builder axiom] else []
      in    errorIf are_conflicts  (conflictInjInstErr     conflicts     )
index 06cb427..51e0015 100644 (file)
@@ -1288,7 +1288,8 @@ tcMethods dfun_id clas tyvars dfun_ev_vars inst_tys
         error_msg dflags = L inst_loc (HsLit (HsStringPrim ""
                                     (unsafeMkByteString (error_string dflags))))
         meth_tau     = funResultTy (applyTys (idType sel_id) inst_tys)
-        error_string dflags = showSDoc dflags (hcat [ppr inst_loc, text "|", ppr sel_id ])
+        error_string dflags = showSDoc dflags
+                              (hcat [ppr inst_loc, vbar, ppr sel_id ])
         lam_wrapper  = mkWpTyLams tyvars <.> mkWpLams dfun_ev_vars
 
     tc_default sel_id (DefMeth dm_name) -- A polymorphic default method
index 3b5d206..d3f8291 100644 (file)
@@ -35,6 +35,7 @@ import Class
 import TyCon
 
 -- others:
+import Coercion    ( pprCoAxBranch )
 import HsSyn            -- HsType
 import TcRnMonad        -- TcType, amongst others
 import FunDeps
@@ -1238,7 +1239,7 @@ wrongATArgErr ty instTy =
 -}
 
 checkValidCoAxiom :: CoAxiom Branched -> TcM ()
-checkValidCoAxiom (CoAxiom { co_ax_tc = fam_tc, co_ax_branches = branches })
+checkValidCoAxiom ax@(CoAxiom { co_ax_tc = fam_tc, co_ax_branches = branches })
   = do { mapM_ (checkValidCoAxBranch Nothing fam_tc) branch_list
        ; foldlM_ check_branch_compat [] branch_list }
   where
@@ -1254,7 +1255,7 @@ checkValidCoAxiom (CoAxiom { co_ax_tc = fam_tc, co_ax_branches = branches })
     check_branch_compat prev_branches cur_branch
       | cur_branch `isDominatedBy` prev_branches
       = do { addWarnAt (coAxBranchSpan cur_branch) $
-             inaccessibleCoAxBranch fam_tc cur_branch
+             inaccessibleCoAxBranch ax cur_branch
            ; return prev_branches }
       | otherwise
       = do { check_injectivity prev_branches cur_branch
@@ -1270,7 +1271,7 @@ checkValidCoAxiom (CoAxiom { co_ax_tc = fam_tc, co_ax_branches = branches })
                      fst $ foldl (gather_conflicts inj prev_branches cur_branch)
                                  ([], 0) prev_branches
            ; mapM_ (\(err, span) -> setSrcSpan span $ addErr err)
-                   (makeInjectivityErrors fam_tc cur_branch inj conflicts) }
+                   (makeInjectivityErrors ax cur_branch inj conflicts) }
       | otherwise
       = return ()
 
@@ -1388,13 +1389,10 @@ isTyFamFree = null . tcTyFamInsts
 
 -- Error messages
 
-inaccessibleCoAxBranch :: TyCon -> CoAxBranch -> SDoc
-inaccessibleCoAxBranch fam_tc (CoAxBranch { cab_tvs = tvs
-                                          , cab_lhs = lhs
-                                          , cab_rhs = rhs })
+inaccessibleCoAxBranch :: CoAxiom br -> CoAxBranch -> SDoc
+inaccessibleCoAxBranch fi_ax cur_branch
   = ptext (sLit "Type family instance equation is overlapped:") $$
-    hang (pprUserForAll tvs)
-       2 (hang (pprTypeApp fam_tc lhs) 2 (equals <+> (ppr rhs)))
+    nest 2 (pprCoAxBranch fi_ax cur_branch)
 
 tyFamInstIllegalErr :: Type -> SDoc
 tyFamInstIllegalErr ty
index 9daa372..34f6edb 100644 (file)
@@ -290,7 +290,7 @@ instance Outputable DefMeth where
 
 pprFundeps :: Outputable a => [FunDep a] -> SDoc
 pprFundeps []  = empty
-pprFundeps fds = hsep (ptext (sLit "|") : punctuate comma (map pprFunDep fds))
+pprFundeps fds = hsep (vbar : punctuate comma (map pprFunDep fds))
 
 pprFunDep :: Outputable a => FunDep a -> SDoc
 pprFunDep (us, vs) = hsep [interppSP us, ptext (sLit "->"), interppSP vs]
index b73ca49..af05d5c 100644 (file)
@@ -754,29 +754,39 @@ ppr_forall_co p ty
     split1 tvs ty               = (reverse tvs, ty)
 
 pprCoAxiom :: CoAxiom br -> SDoc
-pprCoAxiom ax@(CoAxiom { co_ax_tc = tc, co_ax_branches = branches })
-  = hang (ptext (sLit "axiom") <+> ppr ax <+> dcolon)
-       2 (vcat (map (pprCoAxBranch tc) $ fromBranches branches))
+pprCoAxiom ax@(CoAxiom { co_ax_branches = branches })
+  = hang (text "axiom" <+> ppr ax <+> dcolon)
+       2 (vcat (map (ppr_co_ax_branch (const ppr) ax) $ fromBranches branches))
 
-pprCoAxBranch :: TyCon -> CoAxBranch -> SDoc
-pprCoAxBranch fam_tc (CoAxBranch { cab_tvs = tvs
-                                 , cab_lhs = lhs
-                                 , cab_rhs = rhs })
-  = hang (pprUserForAll tvs)
-       2 (hang (pprTypeApp fam_tc lhs) 2 (equals <+> (ppr rhs)))
+pprCoAxBranch :: CoAxiom br -> CoAxBranch -> SDoc
+pprCoAxBranch = ppr_co_ax_branch pprRhs
+  where
+    pprRhs fam_tc (TyConApp tycon _)
+      | isDataFamilyTyCon fam_tc
+      = pprDataCons tycon
+    pprRhs _ rhs = ppr rhs
 
 pprCoAxBranchHdr :: CoAxiom br -> BranchIndex -> SDoc
-pprCoAxBranchHdr ax@(CoAxiom { co_ax_tc = fam_tc, co_ax_name = name }) index
-  | CoAxBranch { cab_lhs = tys, cab_loc = loc } <- coAxiomNthBranch ax index
-  = hang (pprTypeApp fam_tc tys)
-       2 (ptext (sLit "-- Defined") <+> ppr_loc loc)
+pprCoAxBranchHdr ax index = pprCoAxBranch ax (coAxiomNthBranch ax index)
+
+ppr_co_ax_branch :: (TyCon -> Type -> SDoc) -> CoAxiom br -> CoAxBranch -> SDoc
+ppr_co_ax_branch ppr_rhs
+              (CoAxiom { co_ax_tc = fam_tc, co_ax_name = name })
+              (CoAxBranch { cab_tvs = tvs
+                          , cab_lhs = lhs
+                          , cab_rhs = rhs
+                          , cab_loc = loc })
+  = foldr1 (flip hangNotEmpty 2)
+        [ pprUserForAll tvs
+        , pprTypeApp fam_tc lhs <+> equals <+> ppr_rhs fam_tc rhs
+        , text "-- Defined" <+> pprLoc loc ]
   where
-        ppr_loc loc
+        pprLoc loc
           | isGoodSrcSpan loc
-          = ptext (sLit "at") <+> ppr (srcSpanStart loc)
+          = text "at" <+> ppr (srcSpanStart loc)
 
           | otherwise
-          = ptext (sLit "in") <+>
+          = text "in" <+>
               quotes (ppr (nameModule name))
 
 {-
index e09c937..574e153 100644 (file)
@@ -39,6 +39,7 @@ module TypeRep (
         pprKind, pprParendKind, pprTyLit, suppressKinds,
         TyPrec(..), maybeParen, pprTcApp,
         pprPrefixApp, pprArrowChain, ppr_type,
+        pprDataCons,
 
         -- Free variables
         tyVarsOfType, tyVarsOfTypes, closeOverKinds, varSetElemsKvsFirst,
@@ -59,7 +60,7 @@ module TypeRep (
 
 #include "HsVersions.h"
 
-import {-# SOURCE #-} DataCon( dataConTyCon )
+import {-# SOURCE #-} DataCon( DataCon, dataConTyCon, dataConFullSig )
 import {-# SOURCE #-} ConLike ( ConLike(..) )
 import {-# SOURCE #-} Type( isPredTy ) -- Transitively pulls in a LOT of stuff, better to break the loop
 
@@ -77,6 +78,7 @@ import CoAxiom
 import PrelNames
 import Outputable
 import FastString
+import ListSetOps
 import Util
 import DynFlags
 import StaticFlags( opt_PprStyle_Debug )
@@ -693,6 +695,20 @@ remember to parenthesise the operator, thus
 See Trac #2766.
 -}
 
+pprDataCons :: TyCon -> SDoc
+pprDataCons = sepWithVBars . fmap pprDataConWithArgs . tyConDataCons
+  where
+    sepWithVBars [] = empty
+    sepWithVBars docs = sep (punctuate (space <> vbar) docs)
+
+pprDataConWithArgs :: DataCon -> SDoc
+pprDataConWithArgs dc = sep [forAllDoc, thetaDoc, ppr dc <+> argsDoc]
+  where
+    (univ_tvs, ex_tvs, eq_spec, theta, arg_tys, _res_ty) = dataConFullSig dc
+    forAllDoc = pprUserForAll ((univ_tvs `minusList` map fst eq_spec) ++ ex_tvs)
+    thetaDoc  = pprThetaArrowTy theta
+    argsDoc   = hsep (fmap pprParendType arg_tys)
+
 pprTypeApp :: TyCon -> [Type] -> SDoc
 pprTypeApp tc tys = pprTyTcApp TopPrec tc tys
         -- We have to use ppr on the TyCon (not its name)
index 41ac139..382431e 100644 (file)
@@ -193,7 +193,7 @@ pprBooleanFormula :: (Rational -> a -> SDoc) -> Rational -> BooleanFormula a ->
 pprBooleanFormula pprVar = pprBooleanFormula' pprVar pprAnd pprOr
   where
   pprAnd p = cparen (p > 3) . fsep . punctuate comma
-  pprOr  p = cparen (p > 2) . fsep . intersperse (text "|")
+  pprOr  p = cparen (p > 2) . fsep . intersperse vbar
 
 -- Pretty print human in readable format, "either `a' or `b' or (`c', `d' and `e')"?
 pprBooleanFormulaNice :: Outputable a => BooleanFormula a -> SDoc
index 83febd5..fbd6760 100644 (file)
@@ -25,7 +25,7 @@ module Outputable (
         int, intWithCommas, integer, float, double, rational,
         parens, cparen, brackets, braces, quotes, quote,
         doubleQuotes, angleBrackets, paBrackets,
-        semi, comma, colon, dcolon, space, equals, dot,
+        semi, comma, colon, dcolon, space, equals, dot, vbar,
         arrow, larrow, darrow, arrowt, larrowt, arrowtt, larrowtt,
         lparen, rparen, lbrack, rbrack, lbrace, rbrace, underscore,
         blankLine, forAllLit,
@@ -33,7 +33,7 @@ module Outputable (
         ($$), ($+$), vcat,
         sep, cat,
         fsep, fcat,
-        hang, punctuate, ppWhen, ppUnless,
+        hang, hangNotEmpty, punctuate, ppWhen, ppUnless,
         speakNth, speakN, speakNOf, plural, isOrAre, doOrDoes,
 
         coloured, PprColour, colType, colCoerc, colDataCon,
@@ -521,7 +521,7 @@ quotes d =
              ('\'' : _, _)       -> pp_d
              _other              -> Pretty.quotes pp_d
 
-semi, comma, colon, equals, space, dcolon, underscore, dot :: SDoc
+semi, comma, colon, equals, space, dcolon, underscore, dot, vbar :: SDoc
 arrow, larrow, darrow, arrowt, larrowt, arrowtt, larrowtt :: SDoc
 lparen, rparen, lbrack, rbrack, lbrace, rbrace, blankLine :: SDoc
 
@@ -541,6 +541,7 @@ equals     = docToSDoc $ Pretty.equals
 space      = docToSDoc $ Pretty.space
 underscore = char '_'
 dot        = char '.'
+vbar       = char '|'
 lparen     = docToSDoc $ Pretty.lparen
 rparen     = docToSDoc $ Pretty.rparen
 lbrack     = docToSDoc $ Pretty.lbrack
@@ -606,6 +607,12 @@ hang :: SDoc  -- ^ The header
       -> SDoc
 hang d1 n d2   = SDoc $ \sty -> Pretty.hang (runSDoc d1 sty) n (runSDoc d2 sty)
 
+-- | This behaves like 'hang', but does not indent the second document
+-- when the header is empty.
+hangNotEmpty :: SDoc -> Int -> SDoc -> SDoc
+hangNotEmpty d1 n d2 =
+    SDoc $ \sty -> Pretty.hangNotEmpty (runSDoc d1 sty) n (runSDoc d2 sty)
+
 punctuate :: SDoc   -- ^ The punctuation
           -> [SDoc] -- ^ The list that will have punctuation added between every adjacent pair of elements
           -> [SDoc] -- ^ Punctuated list
index 4aae2c8..74d69f2 100644 (file)
@@ -180,7 +180,7 @@ module Pretty (
         sep, cat,
         fsep, fcat,
         nest,
-        hang, punctuate,
+        hang, hangNotEmpty, punctuate,
 
         -- * Predicates on documents
         isEmpty,
@@ -563,6 +563,12 @@ nest k p = mkNest k (reduceDoc p)
 hang :: Doc -> Int -> Doc -> Doc
 hang d1 n d2 = sep [d1, nest n d2]
 
+-- | Apply 'hang' to the arguments if the first 'Doc' is not empty.
+hangNotEmpty :: Doc -> Int -> Doc -> Doc
+hangNotEmpty d1 n d2 = if isEmpty d1
+                       then d2
+                       else hang d1 n d2
+
 -- | @punctuate p [d1, ... dn] = [d1 \<> p, d2 \<> p, ... dn-1 \<> p, dn]@
 punctuate :: Doc -> [Doc] -> [Doc]
 punctuate _ []     = []
index d1ebe58..ff97c50 100644 (file)
@@ -1,62 +1,63 @@
 
 <interactive>:10:15: error:
     Type family equations violate injectivity annotation:
-      F Char Bool Int = Int
-      F Bool Int Char = Int
+      F Char Bool Int = Int -- Defined at <interactive>:10:15
+      F Bool Int Char = Int -- Defined at <interactive>:11:15
 
 <interactive>:16:15: error:
     Type family equations violate injectivity annotation:
-      I Int Char Bool = Bool
-      I Int Int Int = Bool
+      I Int Char Bool = Bool -- Defined at <interactive>:16:15
+      I Int Int Int = Bool -- Defined at <interactive>:17:15
 
 <interactive>:26:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation cannot be a type family:
-      IdProxy a = Id a
+      IdProxy a = Id a -- Defined at <interactive>:26:15
 
 <interactive>:34:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation is a bare type variable
     but these LHS type and kind patterns are not bare variables: ‘'Z’
-      P 'Z m = m
+      P 'Z m = m -- Defined at <interactive>:34:15
 
 <interactive>:40:15: error:
     Type family equation violates injectivity annotation.
     Type variable ‘b’ cannot be inferred from the right-hand side.
     In the type family equation:
-      J Int b c = Char
+      J Int b c = Char -- Defined at <interactive>:40:15
 
 <interactive>:44:15: error:
     Type family equation violates injectivity annotation.
     Type variable ‘n’ cannot be inferred from the right-hand side.
     In the type family equation:
-      K ('S n) m = 'S m
+      K ('S n) m = 'S m -- Defined at <interactive>:44:15
 
 <interactive>:49:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation cannot be a type family:
-      L a = MaybeSyn a
+      L a = MaybeSyn a -- Defined at <interactive>:49:15
 
 <interactive>:55:41: error:
     Type family equation violates injectivity annotation.
     Kind variable ‘k’ cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-      PolyKindVarsF '[] = '[]
+      PolyKindVarsF '[] = '[] -- Defined at <interactive>:55:41
 
 <interactive>:60:15: error:
     Type family equation violates injectivity annotation.
     Kind variable ‘k1’ cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-      PolyKindVars '[] = '[]
+      PolyKindVars '[] = '[] -- Defined at <interactive>:60:15
 
 <interactive>:64:15: error:
     Type family equation violates injectivity annotation.
     Kind variable ‘k’ cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-    forall (k :: BOX) (a :: k) (b :: k). Fc a b = Int
+      forall (k :: BOX) (a :: k) (b :: k).
+        Fc a b = Int -- Defined at <interactive>:64:15
 
 <interactive>:68:15: error:
     Type family equation violates injectivity annotation.
     cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-    forall (k :: BOX) (a :: k) (b :: k). Gc a b = Int
+      forall (k :: BOX) (a :: k) (b :: k).
+        Gc a b = Int -- Defined at <interactive>:68:15
 
 <interactive>:81:15: error:
     Type family equations violate injectivity annotation:
-      F1 [a] = Maybe (GF1 a)
-      F1 (Maybe a) = Maybe (GF2 a)
+      F1 [a] = Maybe (GF1 a) -- Defined at <interactive>:81:15
+      F1 (Maybe a) = Maybe (GF2 a) -- Defined at <interactive>:82:15
 
 <interactive>:85:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation is a bare type variable
     but these LHS type and kind patterns are not bare variables: ‘[a]’
-      W1 [a] = a
+      W1 [a] = a -- Defined at <interactive>:85:15
 
 <interactive>:88:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation cannot be a type family:
-      W2 [a] = W2 a
+      W2 [a] = W2 a -- Defined at <interactive>:88:15
 
 <interactive>:92:15: error:
     Type family equations violate injectivity annotation:
-      Z1 [a] = (a, a)
-      Z1 (Maybe b) = (b, [b])
+      Z1 [a] = (a, a) -- Defined at <interactive>:92:15
+      Z1 (Maybe b) = (b, [b]) -- Defined at <interactive>:93:15
 
 <interactive>:96:15: error:
     Type family equations violate injectivity annotation:
-      G1 [a] = [a]
-      G1 (Maybe b) = [(b, b)]
+      G1 [a] = [a] -- Defined at <interactive>:96:15
+      G1 (Maybe b) = [(b, b)] -- Defined at <interactive>:97:15
 
 <interactive>:100:15: error:
     Type family equations violate injectivity annotation:
-      G3 a Int = (a, Int)
-      G3 a Bool = (Bool, a)
+      G3 a Int = (a, Int) -- Defined at <interactive>:100:15
+      G3 a Bool = (Bool, a) -- Defined at <interactive>:101:15
 
 <interactive>:104:15: error:
     Type family equation violates injectivity annotation.
     Type variable ‘b’ cannot be inferred from the right-hand side.
     In the type family equation:
-      G4 a b = [a]
+      G4 a b = [a] -- Defined at <interactive>:104:15
 
 <interactive>:107:15: error:
     Type family equations violate injectivity annotation:
-      G5 [a] = [GF1 a]
-      G5 Int = [Bool]
+      G5 [a] = [GF1 a] -- Defined at <interactive>:107:15
+      G5 Int = [Bool] -- Defined at <interactive>:108:15
 
 <interactive>:111:15: error:
     Type family equation violates injectivity annotation.
     Type variable ‘a’ cannot be inferred from the right-hand side.
     In the type family equation:
-      G6 [a] = [HF1 a]
+      G6 [a] = [HF1 a] -- Defined at <interactive>:111:15
index 0c31399..d47accb 100644 (file)
@@ -11,7 +11,8 @@ TYPE CONSTRUCTORS
   data ListColl a = L [a]
     Promotable
 COERCION AXIOMS
-  axiom Foo.TFCo:R:ElemListColl :: Elem (ListColl a) = a
+  axiom Foo.TFCo:R:ElemListColl ::
+    Elem (ListColl a) = a -- Defined at T3017.hs:13:9
 INSTANCES
   instance Coll (ListColl a) -- Defined at T3017.hs:12:11
 FAMILY INSTANCES
index 8a4ebdb..79ecd91 100644 (file)
@@ -1,4 +1,4 @@
 
 T9085.hs:7:3: Warning:
     Type family instance equation is overlapped:
-      F Bool = Bool
+      F Bool = Bool -- Defined at T9085.hs:7:3
index bfb5814..c4adb9a 100644 (file)
@@ -1,5 +1,5 @@
 
 NoGood.hs:4:15:
     Conflicting family instance declarations:
-      F a a -- Defined at NoGood.hs:4:15
-      F [a] a -- Defined at NoGood.hs:5:15
+      F a a = Int -- Defined at NoGood.hs:4:15
+      F [a] a = Bool -- Defined at NoGood.hs:5:15
index 3eef322..180bb95 100644 (file)
@@ -1,10 +1,10 @@
 \r
 OverB.hs:7:15:\r
     Conflicting family instance declarations:\r
-      OverA.C [Int] [a] -- Defined at OverB.hs:7:15\r
-      OverA.C [a] [Int] -- Defined at OverC.hs:7:15\r
+      OverA.C [Int] [a] = CListList2 -- Defined at OverB.hs:7:15\r
+      OverA.C [a] [Int] = C9ListList -- Defined at OverC.hs:7:15\r
 \r
 OverB.hs:9:15:\r
     Conflicting family instance declarations:\r
-      OverA.D [Int] [a] -- Defined at OverB.hs:9:15\r
-      OverA.D [a] [Int] -- Defined at OverC.hs:9:15\r
+      OverA.D [Int] [a] = Int -- Defined at OverB.hs:9:15\r
+      OverA.D [a] [Int] = Char -- Defined at OverC.hs:9:15\r
index 2e6b957..d467019 100644 (file)
@@ -1,10 +1,10 @@
 
 SimpleFail11a.hs:6:15:
     Conflicting family instance declarations:
-      C9 Int Int -- Defined at SimpleFail11a.hs:6:15
-      C9 Int Int -- Defined at SimpleFail11a.hs:8:15
+      C9 Int Int = C9IntInt -- Defined at SimpleFail11a.hs:6:15
+      C9 Int Int = C9IntInt2 -- Defined at SimpleFail11a.hs:8:15
 
 SimpleFail11a.hs:11:15:
     Conflicting family instance declarations:
-      D9 Int Int -- Defined at SimpleFail11a.hs:11:15
-      D9 Int Int -- Defined at SimpleFail11a.hs:13:15
+      D9 Int Int = Char -- Defined at SimpleFail11a.hs:11:15
+      D9 Int Int = Int -- Defined at SimpleFail11a.hs:13:15
index 6994b9b..e40a3a6 100644 (file)
@@ -1,10 +1,10 @@
 
 SimpleFail11b.hs:7:15:
     Conflicting family instance declarations:
-      C9 [a] Int -- Defined at SimpleFail11b.hs:7:15
-      C9 [a] Int -- Defined at SimpleFail11b.hs:9:15
+      C9 [a] Int = C9ListInt -- Defined at SimpleFail11b.hs:7:15
+      C9 [a] Int = C9ListInt2 -- Defined at SimpleFail11b.hs:9:15
 
 SimpleFail11b.hs:13:15:
     Conflicting family instance declarations:
-      D9 [a] Int -- Defined at SimpleFail11b.hs:13:15
-      D9 [a] Int -- Defined at SimpleFail11b.hs:15:15
+      D9 [a] Int = [a] -- Defined at SimpleFail11b.hs:13:15
+      D9 [a] Int = Maybe a -- Defined at SimpleFail11b.hs:15:15
index a323efa..d4a1bb4 100644 (file)
@@ -1,10 +1,10 @@
 
 SimpleFail11c.hs:7:15:
     Conflicting family instance declarations:
-      C9 [a] Int -- Defined at SimpleFail11c.hs:7:15
-      C9 [Int] Int -- Defined at SimpleFail11c.hs:9:15
+      C9 [a] Int = C9ListInt -- Defined at SimpleFail11c.hs:7:15
+      C9 [Int] Int = C9ListInt2 -- Defined at SimpleFail11c.hs:9:15
 
 SimpleFail11c.hs:13:15:
     Conflicting family instance declarations:
-      D9 [a] Int -- Defined at SimpleFail11c.hs:13:15
-      D9 [Int] Int -- Defined at SimpleFail11c.hs:15:15
+      D9 [a] Int = [a] -- Defined at SimpleFail11c.hs:13:15
+      D9 [Int] Int = [Bool] -- Defined at SimpleFail11c.hs:15:15
index 72a9f79..cdd8afd 100644 (file)
@@ -1,5 +1,5 @@
 
 SimpleFail11d.hs:8:15:
     Conflicting family instance declarations:
-      C9 [Int] [a] -- Defined at SimpleFail11d.hs:8:15
-      C9 [a] [Int] -- Defined at SimpleFail11d.hs:10:15
+      C9 [Int] [a] = C9ListList2 -- Defined at SimpleFail11d.hs:8:15
+      C9 [a] [Int] = C9ListList -- Defined at SimpleFail11d.hs:10:15
index 1b63dfe..bb0aaca 100644 (file)
@@ -1,5 +1,5 @@
 
 SimpleFail2b.hs:9:11:
     Conflicting family instance declarations:
-      Sd Int -- Defined at SimpleFail2b.hs:9:11
-      Sd Int -- Defined at SimpleFail2b.hs:10:11
+      Sd Int = SdC1 Char -- Defined at SimpleFail2b.hs:9:11
+      Sd Int = SdC2 Char -- Defined at SimpleFail2b.hs:10:11
index 6b4197b..7b7d265 100644 (file)
@@ -13,5 +13,5 @@ T2334A.hs:10:27:
 
 T2334A.hs:12:15:
     Conflicting family instance declarations:
-      F Bool -- Defined at T2334A.hs:12:15
-      F Bool -- Defined at T2334A.hs:13:15
+      F Bool = K1 -- Defined at T2334A.hs:12:15
+      F Bool = K2 -- Defined at T2334A.hs:13:15
index fcc6f8a..1f08b36 100644 (file)
@@ -1,5 +1,5 @@
 
 T2677.hs:6:15:
     Conflicting family instance declarations:
-      A a -- Defined at T2677.hs:6:15
-      A Int -- Defined at T2677.hs:7:15
+      A a = Bool -- Defined at T2677.hs:6:15
+      A Int = Char -- Defined at T2677.hs:7:15
index 5f06978..faa5d1a 100644 (file)
@@ -1,5 +1,5 @@
 
 T3330b.hs:14:10:
     Conflicting family instance declarations:
-      Res c a b -- Defined at T3330b.hs:14:10
-      Res [c] a b -- Defined at T3330b.hs:18:10
+      Res c a b = b -- Defined at T3330b.hs:14:10
+      Res [c] a b = [b] -- Defined at T3330b.hs:18:10
index 26e967a..b653f9a 100644 (file)
@@ -1,10 +1,10 @@
 
 T4246.hs:8:9:
     Conflicting family instance declarations:
-      F a -- Defined at T4246.hs:8:9
-      F Int -- Defined at T4246.hs:11:9
+      F a = a -- Defined at T4246.hs:8:9
+      F Int = Bool -- Defined at T4246.hs:11:9
 
 T4246.hs:14:15:
     Conflicting family instance declarations:
-      G Int -- Defined at T4246.hs:14:15
-      G Int -- Defined at T4246.hs:15:15
+      G Int = Int -- Defined at T4246.hs:14:15
+      G Int = Bool -- Defined at T4246.hs:15:15
index 695a7b4..729ee3a 100644 (file)
@@ -1,5 +1,5 @@
 
 T9371.hs:14:10:
     Conflicting family instance declarations:
-      D -- Defined at T9371.hs:14:10
-      D (x, y) -- Defined at T9371.hs:18:10
+      D = D1 (Either x ()) -- Defined at T9371.hs:14:10
+      D (x, y) = D2 (x, y) -- Defined at T9371.hs:18:10
index dd1de7e..ec41b12 100644 (file)
@@ -6,7 +6,8 @@ TYPE CONSTRUCTORS
   data family Sing (a :: k)
 COERCION AXIOMS
   axiom DataFamilyInstanceLHS.TFCo:R:SingMyKind_ ::
-      Sing = DataFamilyInstanceLHS.R:SingMyKind_
+    Sing = DataFamilyInstanceLHS.R:SingMyKind_
+      -- Defined at DataFamilyInstanceLHS.hs:8:15
 FAMILY INSTANCES
   data instance Sing
 Dependent modules: []
index 44f05a7..ebd327c 100644 (file)
@@ -3,8 +3,10 @@ TYPE SIGNATURES
 TYPE CONSTRUCTORS
   type family F a b :: * open
 COERCION AXIOMS
-  axiom TypeFamilyInstanceLHS.TFCo:R:FBool_ :: F Bool _ = Bool
-  axiom TypeFamilyInstanceLHS.TFCo:R:FInt_ :: F Int _ = Int
+  axiom TypeFamilyInstanceLHS.TFCo:R:FBool_ ::
+    F Bool _ = Bool -- Defined at TypeFamilyInstanceLHS.hs:6:15
+  axiom TypeFamilyInstanceLHS.TFCo:R:FInt_ ::
+    F Int _ = Int -- Defined at TypeFamilyInstanceLHS.hs:5:15
 FAMILY INSTANCES
   type instance F Int _
   type instance F Bool _
index 3a38ed4..83b355e 100644 (file)
@@ -1,5 +1,6 @@
 \r
 T7524.hs:5:15:\r
     Conflicting family instance declarations:\r
-      F a a -- Defined at T7524.hs:5:15\r
-      F a b -- Defined at T7524.hs:6:15\r
+      forall (k :: BOX) (a :: k). F a a = Int -- Defined at T7524.hs:5:15\r
+      forall (k :: BOX) (k1 :: BOX) (a :: k) (b :: k1).\r
+        F a b = Bool -- Defined at T7524.hs:6:15\r
index ca1f817..08e3b8c 100644 (file)
@@ -5,7 +5,7 @@ TYPE CONSTRUCTORS
     meth2 :: a -> a
     {-# MINIMAL meth2 #-}
 COERCION AXIOMS
-  axiom Roles12.NTCo:C2 :: C2 a = a -> a
+  axiom Roles12.NTCo:C2 :: C2 a = a -> a -- Defined at Roles14.hs:6:1
 Dependent modules: []
 Dependent packages: [base-4.9.0.0, ghc-prim-0.5.0.0,
                      integer-gmp-1.0.0.0]
index b449299..f097602 100644 (file)
@@ -17,10 +17,13 @@ TYPE CONSTRUCTORS
   type Syn1 a = F4 a
   type Syn2 a = [a]
 COERCION AXIOMS
-  axiom Roles3.NTCo:C1 :: C1 a = a -> a
-  axiom Roles3.NTCo:C2 :: C2 a b = (a ~ b) => a -> b
-  axiom Roles3.NTCo:C3 :: C3 a b = a -> F3 b -> F3 b
-  axiom Roles3.NTCo:C4 :: C4 a b = a -> F4 b -> F4 b
+  axiom Roles3.NTCo:C1 :: C1 a = a -> a -- Defined at Roles3.hs:6:1
+  axiom Roles3.NTCo:C2 ::
+    C2 a b = (a ~ b) => a -> b -- Defined at Roles3.hs:9:1
+  axiom Roles3.NTCo:C3 ::
+    C3 a b = a -> F3 b -> F3 b -- Defined at Roles3.hs:12:1
+  axiom Roles3.NTCo:C4 ::
+    C4 a b = a -> F4 b -> F4 b -- Defined at Roles3.hs:18:1
 Dependent modules: []
 Dependent packages: [base-4.9.0.0, ghc-prim-0.5.0.0,
                      integer-gmp-1.0.0.0]
index bcc1f44..67b75cd 100644 (file)
@@ -8,8 +8,9 @@ TYPE CONSTRUCTORS
     {-# MINIMAL meth3 #-}
   type Syn1 a = [a]
 COERCION AXIOMS
-  axiom Roles4.NTCo:C1 :: C1 a = a -> a
-  axiom Roles4.NTCo:C3 :: C3 a = a -> Syn1 a
+  axiom Roles4.NTCo:C1 :: C1 a = a -> a -- Defined at Roles4.hs:6:1
+  axiom Roles4.NTCo:C3 ::
+    C3 a = a -> Syn1 a -- Defined at Roles4.hs:11:1
 Dependent modules: []
 Dependent packages: [base-4.9.0.0, ghc-prim-0.5.0.0,
                      integer-gmp-1.0.0.0]
index 7d59803..efb7488 100644 (file)
@@ -10,7 +10,8 @@ TYPE CONSTRUCTORS
   type role Representational representational
   class Representational a
 COERCION AXIOMS
-  axiom T8958.NTCo:Map :: Map k v = [(k, v)]
+  axiom T8958.NTCo:Map ::
+    Map k v = [(k, v)] -- Defined at T8958.hs:13:1
 INSTANCES
   instance [incoherent] Nominal a -- Defined at T8958.hs:7:10
   instance [incoherent] Representational a
index 4579ea5..7193fb5 100644 (file)
@@ -1,5 +1,5 @@
 
 T6018th.hs:97:4:
     Type family equations violate injectivity annotation:
-      H Int Int Int = Bool
-      H Int Char Bool = Bool
+      H Int Int Int = Bool -- Defined at T6018th.hs:97:4
+      H Int Char Bool = Bool -- Defined at T6018th.hs:97:4
index 41e94d8..b843f5f 100644 (file)
@@ -4,8 +4,8 @@
 
 T6018.hs:75:5: Warning:
     Type family instance equation is overlapped:
-       Foo Bool = Bool
+      Foo Bool = Bool -- Defined at T6018.hs:75:5
 
 T6018.hs:82:5: Warning:
     Type family instance equation is overlapped:
-       Bar Bool = Char
+      Bar Bool = Char -- Defined at T6018.hs:82:5
index b713423..2377c13 100644 (file)
@@ -14,7 +14,8 @@ TYPE CONSTRUCTORS
     {-# MINIMAL huh #-}
 COERCION AXIOMS
   axiom NTCo:Zork ::
-      Zork s a b = forall chain. Q s a chain -> ST s ()
+    Zork s a b = forall chain. Q s a chain -> ST s ()
+      -- Defined at tc231.hs:25:1
 Dependent modules: []
 Dependent packages: [base-4.9.0.0, ghc-prim-0.5.0.0,
                      integer-gmp-1.0.0.0]
index 6409972..24aeed0 100644 (file)
@@ -1,4 +1,4 @@
 
 tc265.hs:8:3: warning:
     Type family instance equation is overlapped:
-      F (T Int) = Bool
+      F (T Int) = Bool -- Defined at tc265.hs:8:3
index b96d371..2e92e61 100644 (file)
@@ -1,14 +1,14 @@
 
 T10836.hs:5:5: error:
     Type family equations violate injectivity annotation:
-      Foo Int = Int
-      Foo Bool = Int
+      Foo Int = Int -- Defined at T10836.hs:5:5
+      Foo Bool = Int -- Defined at T10836.hs:6:5
     In the equations for closed type family ‘Foo’
     In the type family declaration for ‘Foo’
 
 T10836.hs:9:5: error:
     Type family equations violate injectivity annotation:
-      Bar Int = Int
-      Bar Bool = Int
+      Bar Int = Int -- Defined at T10836.hs:9:5
+      Bar Bool = Int -- Defined at T10836.hs:10:5
     In the equations for closed type family ‘Bar’
     In the type family declaration for ‘Bar’
index a86ad80..a0f5439 100644 (file)
@@ -6,77 +6,78 @@
 
 T6018Afail.hs:7:15: error:
     Type family equations violate injectivity annotation:
-      G Char Bool Int = Int
-      G Bool Int Char = Int
+      G Char Bool Int = Int -- Defined at T6018Afail.hs:7:15
+      G Bool Int Char = Int -- Defined at T6018fail.hs:15:15
 
 T6018Dfail.hs:7:15: error:
     Type family equations violate injectivity annotation:
-      T6018Bfail.H Bool Int Char = Int
-      T6018Bfail.H Char Bool Int = Int
+      T6018Bfail.H Bool Int Char = Int -- Defined at T6018Dfail.hs:7:15
+      T6018Bfail.H Char Bool Int = Int -- Defined at T6018Cfail.hs:8:15
 
 T6018fail.hs:13:15: error:
     Type family equations violate injectivity annotation:
-      F Bool Int Char = Int
-      F Char Bool Int = Int
+      F Bool Int Char = Int -- Defined at T6018fail.hs:13:15
+      F Char Bool Int = Int -- Defined at T6018fail.hs:12:15
 
 T6018fail.hs:19:15: error:
     Type family equations violate injectivity annotation:
-      I Int Int Int = Bool
-      I Int Char Bool = Bool
+      I Int Int Int = Bool -- Defined at T6018fail.hs:19:15
+      I Int Char Bool = Bool -- Defined at T6018fail.hs:18:15
 
 T6018fail.hs:28:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation cannot be a type family:
-      IdProxy a = Id a
+      IdProxy a = Id a -- Defined at T6018fail.hs:28:15
 
 T6018fail.hs:36:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation is a bare type variable
     but these LHS type and kind patterns are not bare variables: ‘'Z’
-      P 'Z m = m
+      P 'Z m = m -- Defined at T6018fail.hs:36:15
 
 T6018fail.hs:37:15: error:
     Type family equations violate injectivity annotation:
-      P ('S n) m = 'S (P n m)
-      P 'Z m = m
+      P ('S n) m = 'S (P n m) -- Defined at T6018fail.hs:37:15
+      P 'Z m = m -- Defined at T6018fail.hs:36:15
 
 T6018fail.hs:42:15: error:
     Type family equation violates injectivity annotation.
     Type variable ‘b’ cannot be inferred from the right-hand side.
     In the type family equation:
-      J Int b c = Char
+      J Int b c = Char -- Defined at T6018fail.hs:42:15
 
 T6018fail.hs:46:15: error:
     Type family equation violates injectivity annotation.
     Type variable ‘n’ cannot be inferred from the right-hand side.
     In the type family equation:
-      K ('S n) m = 'S m
+      K ('S n) m = 'S m -- Defined at T6018fail.hs:46:15
 
 T6018fail.hs:51:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation cannot be a type family:
-      L a = MaybeSyn a
+      L a = MaybeSyn a -- Defined at T6018fail.hs:51:15
 
 T6018fail.hs:59:10: error:
     Type family equation violates injectivity annotation.
     Kind variable ‘k’ cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-      PolyKindVarsF '[] = '[]
+      PolyKindVarsF '[] = '[] -- Defined at T6018fail.hs:59:10
 
 T6018fail.hs:62:15: error:
     Type family equation violates injectivity annotation.
     Kind variable ‘k1’ cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-      PolyKindVars '[] = '[]
+      PolyKindVars '[] = '[] -- Defined at T6018fail.hs:62:15
 
 T6018fail.hs:66:15: error:
     Type family equation violates injectivity annotation.
     Kind variable ‘k’ cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-    forall (k :: BOX) (a :: k) (b :: k). Fc a b = Int
+      forall (k :: BOX) (a :: k) (b :: k).
+        Fc a b = Int -- Defined at T6018fail.hs:66:15
 
 T6018fail.hs:70:15: error:
     Type family equation violates injectivity annotation.
@@ -84,55 +85,56 @@ T6018fail.hs:70:15: error:
     cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-    forall (k :: BOX) (a :: k) (b :: k). Gc a b = Int
+      forall (k :: BOX) (a :: k) (b :: k).
+        Gc a b = Int -- Defined at T6018fail.hs:70:15
 
 T6018fail.hs:75:15: error:
     Type family equations violate injectivity annotation:
-      F1 (Maybe a) = Maybe (GF2 a)
-      F1 [a] = Maybe (GF1 a)
+      F1 (Maybe a) = Maybe (GF2 a) -- Defined at T6018fail.hs:75:15
+      F1 [a] = Maybe (GF1 a) -- Defined at T6018fail.hs:74:15
 
 T6018fail.hs:87:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation is a bare type variable
     but these LHS type and kind patterns are not bare variables: ‘[a]’
-      W1 [a] = a
+      W1 [a] = a -- Defined at T6018fail.hs:87:15
 
 T6018fail.hs:90:15: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation cannot be a type family:
-      W2 [a] = W2 a
+      W2 [a] = W2 a -- Defined at T6018fail.hs:90:15
 
 T6018fail.hs:95:15: error:
     Type family equations violate injectivity annotation:
-      Z1 (Maybe b) = (b, [b])
-      Z1 [a] = (a, a)
+      Z1 (Maybe b) = (b, [b]) -- Defined at T6018fail.hs:95:15
+      Z1 [a] = (a, a) -- Defined at T6018fail.hs:94:15
 
 T6018fail.hs:99:15: error:
     Type family equations violate injectivity annotation:
-      G1 (Maybe b) = [(b, b)]
-      G1 [a] = [a]
+      G1 (Maybe b) = [(b, b)] -- Defined at T6018fail.hs:99:15
+      G1 [a] = [a] -- Defined at T6018fail.hs:98:15
 
 T6018fail.hs:103:15: error:
     Type family equations violate injectivity annotation:
-      G3 a Bool = (Bool, a)
-      G3 a Int = (a, Int)
+      G3 a Bool = (Bool, a) -- Defined at T6018fail.hs:103:15
+      G3 a Int = (a, Int) -- Defined at T6018fail.hs:102:15
 
 T6018fail.hs:106:15: error:
     Type family equation violates injectivity annotation.
     Type variable ‘b’ cannot be inferred from the right-hand side.
     In the type family equation:
-      G4 a b = [a]
+      G4 a b = [a] -- Defined at T6018fail.hs:106:15
 
 T6018fail.hs:110:15: error:
     Type family equations violate injectivity annotation:
-      G5 Int = [Bool]
-      G5 [a] = [GF1 a]
+      G5 Int = [Bool] -- Defined at T6018fail.hs:110:15
+      G5 [a] = [GF1 a] -- Defined at T6018fail.hs:109:15
 
 T6018fail.hs:113:15: error:
     Type family equation violates injectivity annotation.
     Type variable ‘a’ cannot be inferred from the right-hand side.
     In the type family equation:
-      G6 [a] = [HF1 a]
+      G6 [a] = [HF1 a] -- Defined at T6018fail.hs:113:15
 
 T6018fail.hs:118:15: error:
     Type family equation violates injectivity annotation.
@@ -140,15 +142,16 @@ T6018fail.hs:118:15: error:
     cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-    forall (k :: BOX) a b (c :: k). G7 a b c = [G7a a b c]
+      forall (k :: BOX) a b (c :: k).
+        G7 a b c = [G7a a b c] -- Defined at T6018fail.hs:118:15
 
 T6018fail.hs:129:1: error:
     Type family equations violate injectivity annotation:
-      FC Int Bool = Bool
-      FC Int Char = Bool
+      FC Int Bool = Bool -- Defined at T6018fail.hs:129:1
+      FC Int Char = Bool -- Defined at T6018fail.hs:125:10
 
 T6018fail.hs:134:1: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation is a bare type variable
     but these LHS type and kind patterns are not bare variables: ‘*’, ‘Char’
-      FC Char a = a
+      FC Char a = a -- Defined at T6018fail.hs:134:1
index 6744400..2afafbe 100644 (file)
@@ -2,7 +2,7 @@
 T6018failclosed.hs:11:5: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation cannot be a type family:
-      IdProxyClosed a = IdClosed a
+      IdProxyClosed a = IdClosed a -- Defined at T6018failclosed.hs:11:5
     In the equations for closed type family ‘IdProxyClosed’
     In the type family declaration for ‘IdProxyClosed’
 
@@ -10,14 +10,15 @@ T6018failclosed.hs:19:5: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation is a bare type variable
     but these LHS type and kind patterns are not bare variables: ‘'Z’
-      PClosed 'Z m = m
+      PClosed 'Z m = m -- Defined at T6018failclosed.hs:19:5
     In the equations for closed type family ‘PClosed’
     In the type family declaration for ‘PClosed’
 
 T6018failclosed.hs:19:5: error:
     Type family equations violate injectivity annotation:
-      PClosed 'Z m = m
+      PClosed 'Z m = m -- Defined at T6018failclosed.hs:19:5
       PClosed ('S n) m = 'S (PClosed n m)
+        -- Defined at T6018failclosed.hs:20:5
     In the equations for closed type family ‘PClosed’
     In the type family declaration for ‘PClosed’
 
@@ -27,8 +28,8 @@ T6018failclosed.hs:25:5: error:
     cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-    forall (k :: BOX) (k1 :: BOX) (b :: k) (c :: k1).
-      JClosed Int b c = Char
+      forall (k :: BOX) (k1 :: BOX) (b :: k) (c :: k1).
+        JClosed Int b c = Char -- Defined at T6018failclosed.hs:25:5
     In the equations for closed type family ‘JClosed’
     In the type family declaration for ‘JClosed’
 
@@ -36,28 +37,29 @@ T6018failclosed.hs:30:5: error:
     Type family equation violates injectivity annotation.
     Type variable ‘n’ cannot be inferred from the right-hand side.
     In the type family equation:
-      KClosed ('S n) m = 'S m
+      KClosed ('S n) m = 'S m -- Defined at T6018failclosed.hs:30:5
     In the equations for closed type family ‘KClosed’
     In the type family declaration for ‘KClosed’
 
 T6018failclosed.hs:35:5: error:
     Type family equation violates injectivity annotation.
     RHS of injective type family equation cannot be a type family:
-    forall (k :: BOX) (a :: k). LClosed a = MaybeSynClosed a
+      forall (k :: BOX) (a :: k).
+        LClosed a = MaybeSynClosed a -- Defined at T6018failclosed.hs:35:5
     In the equations for closed type family ‘LClosed’
     In the type family declaration for ‘LClosed’
 
 T6018failclosed.hs:39:5: error:
     Type family equations violate injectivity annotation:
-      FClosed Char Bool Int = Int
-      FClosed Bool Int Char = Int
+      FClosed Char Bool Int = Int -- Defined at T6018failclosed.hs:39:5
+      FClosed Bool Int Char = Int -- Defined at T6018failclosed.hs:40:5
     In the equations for closed type family ‘FClosed’
     In the type family declaration for ‘FClosed’
 
 T6018failclosed.hs:43:5: error:
     Type family equations violate injectivity annotation:
-      IClosed Int Char Bool = Bool
-      IClosed Int Int Int = Bool
+      IClosed Int Char Bool = Bool -- Defined at T6018failclosed.hs:43:5
+      IClosed Int Int Int = Bool -- Defined at T6018failclosed.hs:44:5
     In the equations for closed type family ‘IClosed’
     In the type family declaration for ‘IClosed’
 
@@ -65,14 +67,14 @@ T6018failclosed.hs:50:3: error:
     Type family equation violates injectivity annotation.
     Type variable ‘a’ cannot be inferred from the right-hand side.
     In the type family equation:
-      E2 a = 'False
+      E2 a = 'False -- Defined at T6018failclosed.hs:50:3
     In the equations for closed type family ‘E2’
     In the type family declaration for ‘E2’
 
 T6018failclosed.hs:61:3: error:
     Type family equations violate injectivity annotation:
-      F a IO = IO a
-      F Char b = b Int
+      F a IO = IO a -- Defined at T6018failclosed.hs:61:3
+      F Char b = b Int -- Defined at T6018failclosed.hs:62:3
     In the equations for closed type family ‘F’
     In the type family declaration for ‘F’
 
@@ -81,6 +83,7 @@ T6018failclosed.hs:66:5: error:
     Kind variable ‘k’ cannot be inferred from the right-hand side.
     (enabling -fprint-explicit-kinds might help)
     In the type family equation:
-    forall (k :: BOX) (a :: k) (b :: k). Gc a b = Int
+      forall (k :: BOX) (a :: k) (b :: k).
+        Gc a b = Int -- Defined at T6018failclosed.hs:66:5
     In the equations for closed type family ‘Gc’
     In the type family declaration for ‘Gc’