Also show types that subsume a hole as valid substitutions for that hole.
authorMatthías Páll Gissurarson <mpg@mpg.is>
Thu, 21 Sep 2017 18:14:53 +0000 (14:14 -0400)
committerBen Gamari <ben@smart-cactus.org>
Thu, 21 Sep 2017 18:53:32 +0000 (14:53 -0400)
This builds on the previous "Valid substitutions include..." functionality,
but add subsumption checking as well, so that the suggested valid substitutions
show not only exact matches, but also identifiers that fit the hole by virtue of
subsuming the type of the hole (i.e. being more general than the type of the
hole).

Building on the previous example, in the given program

```
ps :: String -> IO ()
ps = putStrLn

ps2 :: a -> IO ()
ps2 _ = putStrLn "hello, world"

main :: IO ()
main = _ "hello, world"
```

The results would be something like

```
    • Found hole: _ :: [Char] -> IO ()
    • In the expression: _
      In the expression: _ "hello, world"
      In an equation for ‘main’: main = _ "hello, world"
    • Relevant bindings include main :: IO () (bound at t1.hs:8:1)
      Valid substitutions include
        ps :: String -> IO () (defined at t1.hs:2:1)
        ps2 :: forall a. a -> IO () (defined at t1.hs:5:1)
        putStrLn :: String -> IO ()
          (imported from ‘Prelude’ at t1.hs:1:1
           (and originally defined in ‘System.IO’))
        fail :: forall (m :: * -> *). Monad m => forall a. String -> m a
          (imported from ‘Prelude’ at t1.hs:1:1
           (and originally defined in ‘GHC.Base’))
        mempty :: forall a. Monoid a => a
          (imported from ‘Prelude’ at t1.hs:1:1
           (and originally defined in ‘GHC.Base’))
        print :: forall a. Show a => a -> IO ()
          (imported from ‘Prelude’ at t1.hs:1:1
           (and originally defined in ‘System.IO’))
        (Some substitutions suppressed;
         use -fmax-valid-substitutions=N or -fno-max-valid-substitutions)
```

Signed-off-by: Matthías Páll Gissurarson <mpg@mpg.is>
Modified according to suggestions from Simon PJ

Accept tests that match the expectations, still a few to look better at

Swithced to using tcLookup, after sit down with SPJ at ICFP. Implications are WIP.

Now works with polymorphism and constraints!

We still need to merge the latest master, before we can make a patch.

Wrap the type of the hole, instead of implication shenanigans,

As per SPJs suggestion, this is simpler and feels closer to
what we actually want to do.

Updated tests with the new implementation

Remove debugging trace and update documentation

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: RyanGlScott, rwbarton, thomie

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

26 files changed:
compiler/typecheck/TcEnv.hs
compiler/typecheck/TcErrors.hs
compiler/typecheck/TcRnTypes.hs
compiler/typecheck/TcSimplify.hs
compiler/typecheck/TcSimplify.hs-boot [new file with mode: 0644]
testsuite/tests/gadt/T12468.stderr
testsuite/tests/ghci/scripts/T10248.stderr
testsuite/tests/ghci/scripts/T10249.stderr
testsuite/tests/ghci/scripts/T8353.stderr
testsuite/tests/module/mod71.stderr
testsuite/tests/partial-sigs/should_compile/T12531.stderr
testsuite/tests/th/T10267.stderr
testsuite/tests/typecheck/should_compile/T13050.stderr
testsuite/tests/typecheck/should_compile/T9497a.stderr
testsuite/tests/typecheck/should_compile/all.T
testsuite/tests/typecheck/should_compile/hole_constraints.stderr
testsuite/tests/typecheck/should_compile/hole_constraints_nested.stderr
testsuite/tests/typecheck/should_compile/holes.stderr
testsuite/tests/typecheck/should_compile/holes2.stderr
testsuite/tests/typecheck/should_compile/holes3.stderr
testsuite/tests/typecheck/should_compile/valid_substitutions.stderr
testsuite/tests/typecheck/should_fail/T12177.stderr
testsuite/tests/typecheck/should_fail/T9497d.stderr
testsuite/tests/typecheck/should_run/T9497a-run.stderr
testsuite/tests/typecheck/should_run/T9497b-run.stderr
testsuite/tests/typecheck/should_run/T9497c-run.stderr

index 79ba7c5..e8ddd07 100644 (file)
@@ -34,7 +34,7 @@ module TcEnv(
         isTypeClosedLetBndr,
 
         tcLookup, tcLookupLocated, tcLookupLocalIds,
-        tcLookupId, tcLookupTyVar,
+        tcLookupId, tcLookupIdMaybe, tcLookupTyVar,
         tcLookupLcl_maybe,
         getInLocalScope,
         wrongThingErr, pprBinders,
@@ -352,11 +352,18 @@ tcLookupId :: Name -> TcM Id
 --
 -- The Id is never a DataCon. (Why does that matter? see TcExpr.tcId)
 tcLookupId name = do
-    thing <- tcLookup name
+    thing <- tcLookupIdMaybe name
     case thing of
-        ATcId { tct_id = id} -> return id
-        AGlobal (AnId id)    -> return id
-        _                    -> pprPanic "tcLookupId" (ppr name)
+        Just id -> return id
+        _       -> pprPanic "tcLookupId" (ppr name)
+
+tcLookupIdMaybe :: Name -> TcM (Maybe Id)
+tcLookupIdMaybe name
+  = do { thing <- tcLookup name
+       ; case thing of
+           ATcId { tct_id = id} -> return $ Just id
+           AGlobal (AnId id)    -> return $ Just id
+           _                    -> return Nothing }
 
 tcLookupLocalIds :: [Name] -> TcM [TcId]
 -- We expect the variables to all be bound, and all at
index d7c9714..795c3e5 100644 (file)
@@ -46,10 +46,10 @@ import NameSet
 import Bag
 import ErrUtils         ( ErrMsg, errDoc, pprLocErrMsg )
 import BasicTypes
-import ConLike          ( ConLike(..), conLikeWrapId_maybe )
+import ConLike          ( ConLike(..))
 import Util
-import HscTypes (HscEnv, lookupTypeHscEnv, TypeEnv, lookupTypeEnv )
-import NameEnv (lookupNameEnv)
+import TcEnv (tcLookupIdMaybe)
+import {-# SOURCE #-} TcSimplify ( tcSubsumes )
 import FastString
 import Outputable
 import SrcLoc
@@ -62,7 +62,7 @@ import FV ( fvVarList, unionFV )
 
 import Control.Monad    ( when )
 import Data.Foldable    ( toList )
-import Data.List        ( partition, mapAccumL, nub, sortBy, unfoldr )
+import Data.List        ( partition, mapAccumL, nub, sortBy, unfoldr, foldl')
 import qualified Data.Set as Set
 
 import Data.Semigroup   ( Semigroup )
@@ -1076,7 +1076,7 @@ mkHoleError ctxt ct@(CHoleCan { cc_hole = hole })
                   = givenConstraintsMsg ctxt
                | otherwise = empty
 
-       ; sub_msg <-  validSubstitutions ct
+       ; sub_msg <- validSubstitutions ctxt ct
        ; mkErrorMsgFromCt ctxt ct $
             important hole_msg `mappend`
             relevant_bindings (binds_msg $$ constraints_msg) `mappend`
@@ -1128,26 +1128,37 @@ mkHoleError _ ct = pprPanic "mkHoleError" (ppr ct)
 
 
 -- See Note [Valid substitutions include ...]
-validSubstitutions :: Ct -> TcM SDoc
-validSubstitutions ct | isExprHoleCt ct =
-  do { top_env <- getTopEnv
-     ; rdr_env <- getGlobalRdrEnv
-     ; gbl_env <- tcg_type_env <$> getGblEnv
-     ; lcl_env <- getLclTypeEnv
+validSubstitutions :: ReportErrCtxt -> Ct -> TcM SDoc
+validSubstitutions (CEC {cec_encl = implics}) ct | isExprHoleCt ct =
+  do { rdr_env <- getGlobalRdrEnv
      ; dflags <- getDynFlags
+     ; traceTc "findingValidSubstitutionsFor {" $ ppr wrapped_hole_ty
      ; (discards, substitutions) <-
-        go (gbl_env, lcl_env, top_env) (maxValidSubstitutions dflags)
-         $ localsFirst $ globalRdrEnvElts rdr_env
+        setTcLevel hole_lvl $
+         go (maxValidSubstitutions dflags) $
+          localsFirst $ globalRdrEnvElts rdr_env
+     ; traceTc "}" empty
      ; return $ ppUnless (null substitutions) $
                  hang (text "Valid substitutions include")
                   2 (vcat (map (ppr_sub rdr_env) substitutions)
                     $$ ppWhen discards subsDiscardMsg) }
   where
+    -- We extract the type of the hole from the constraint.
     hole_ty :: TcPredType
     hole_ty = ctEvPred (ctEvidence ct)
+    hole_loc = ctEvLoc $ ctEvidence ct
+    hole_env = ctLocEnv $ hole_loc
+    hole_lvl = ctLocLevel $ hole_loc
 
-    hole_env = ctLocEnv $ ctEvLoc $ ctEvidence ct
 
+    -- For checking, we wrap the type of the hole with all the givens
+    -- from all the implications in the context.
+    wrapped_hole_ty :: TcSigmaType
+    wrapped_hole_ty = foldl' wrapType hole_ty implics
+
+
+    -- We rearrange the elements to make locals appear at the top of the list,
+    -- since they're most likely to be relevant to the user
     localsFirst :: [GlobalRdrElt] -> [GlobalRdrElt]
     localsFirst elts = lcl ++ gbl
       where (lcl, gbl) = partition gre_lcl elts
@@ -1157,12 +1168,19 @@ validSubstitutions ct | isExprHoleCt ct =
     is_id_bind (TcIdBndr_ExpType {}) = True
     is_id_bind (TcTvBndr {})         = False
 
-    relBindSet = mkOccSet $ [ occName b | b <- tcl_bndrs hole_env
-                                        , is_id_bind b ]
+    -- The set of relevant bindings. We use it to make sure we don't repeat
+    -- ids from the relevant bindings again in the suggestions.
+    relBindSet :: OccSet
+    relBindSet =  mkOccSet [ occName b | b <- tcl_bndrs hole_env
+                                       , is_id_bind b ]
 
+    -- We skip elements that are already in the "Relevant Bindings Include"
+    -- part of the error message, as given by the relBindSet.
     shouldBeSkipped :: GlobalRdrElt -> Bool
     shouldBeSkipped el = (occName $ gre_name el) `elemOccSet` relBindSet
 
+    -- For pretty printing, we look up the name and type of the substitution
+    -- we found.
     ppr_sub :: GlobalRdrEnv -> Id -> SDoc
     ppr_sub rdr_env id = case lookupGRE_Name rdr_env (idName id) of
         Just elt -> sep [ idAndTy, nest 2 (parens $ pprNameProvenance elt)]
@@ -1171,54 +1189,37 @@ validSubstitutions ct | isExprHoleCt ct =
             ty = varType id
             idAndTy = (pprPrefixOcc name <+> dcolon <+> pprType ty)
 
-    tyToId :: TyThing -> Maybe Id
-    tyToId (AnId i) = Just i
-    tyToId (AConLike c) = conLikeWrapId_maybe c
-    tyToId _ = Nothing
-
-    tcTyToId :: TcTyThing -> Maybe Id
-    tcTyToId (AGlobal id) = tyToId id
-    tcTyToId (ATcId id _) = Just id
-    tcTyToId _ = Nothing
-
-    substituteable :: Id -> Bool
-    substituteable = tcEqType hole_ty . varType
+    -- The real work happens here, where we invoke the typechecker to check
+    -- whether we the given type fits into the hole!
+    substituteable :: Id -> TcM Bool
+    substituteable id = wrapped_hole_ty `tcSubsumes` ty
+      where ty = varType id
 
-    lookupTopId :: HscEnv -> Name -> IO (Maybe Id)
-    lookupTopId env name =
-        maybe Nothing tyToId <$> lookupTypeHscEnv env name
-
-    lookupGblId :: TypeEnv -> Name -> Maybe Id
-    lookupGblId env name = maybe Nothing tyToId $ lookupTypeEnv env name
+    -- Kickoff the checking of the elements. The first argument
+    -- is a counter, so that we stop after finding functions up to the
+    -- limit the user gives us.
+    go :: Maybe Int -> [GlobalRdrElt] -> TcM (Bool, [Id])
+    go = go_ []
 
-    lookupLclId :: TcTypeEnv -> Name -> Maybe Id
-    lookupLclId env name = maybe Nothing tcTyToId $ lookupNameEnv env name
+    -- We iterate over the elements, checking each one in turn. If we've
+    -- already found -fmax-valid-substitutions=n elements, we look no further.
+    go_ :: [Id] -> Maybe Int -> [GlobalRdrElt] -> TcM (Bool, [Id])
+    go_ subs _ [] = return (False, reverse subs)
+    go_ subs (Just 0) _ = return (True, reverse subs)
+    go_ subs maxleft (el:elts) =
+      if shouldBeSkipped el then discard_it
+      else do { maybeId <- tcLookupIdMaybe (gre_name el)
+              ; case maybeId of
+                Just id -> do { canSub <- substituteable id
+                              ; if canSub then (keep_it id) else discard_it }
+                _ -> discard_it
+              }
+      where discard_it = go_ subs maxleft elts
+            keep_it id = go_ (id:subs) ((\n -> n - 1) <$> maxleft) elts
 
-    go ::  (TypeEnv, TcTypeEnv, HscEnv) -> Maybe Int -> [GlobalRdrElt]
-       -> TcM (Bool, [Id])
-    go = go_ []
 
-    go_ ::  [Id] -> (TypeEnv, TcTypeEnv, HscEnv) -> Maybe Int -> [GlobalRdrElt]
-         -> TcM (Bool, [Id])
-    go_ subs _ _ [] = return (False, reverse subs)
-    go_ subs _ (Just 0) _ = return (True, reverse subs)
-    go_ subs envs@(gbl,lcl,top) maxleft (el:elts) =
-       if shouldBeSkipped el then discard_it
-         else do { maybeId <- liftIO lookupId
-                 ; case maybeId of
-                     Just id | substituteable id ->
-                       go_ (id:subs) envs ((\n -> n - 1) <$> maxleft) elts
-                     _ -> discard_it }
-      where name = gre_name el
-            discard_it = go_ subs envs maxleft elts
-            getTopId = lookupTopId top name
-            gbl_id = lookupGblId gbl name
-            lcl_id = lookupLclId lcl name
-            lookupId = if (isJust lcl_id) then return lcl_id
-                       else if (isJust gbl_id) then return gbl_id else getTopId
-
-
-validSubstitutions _ = return empty
+-- We don't (as of yet) handle holes in types, only in expressions.
+validSubstitutions _ _ = return empty
 
 
 -- See Note [Constraints include ...]
@@ -1265,39 +1266,55 @@ Note [Valid substitutions include ...]
 `validSubstitutions` returns the "Valid substitutions include ..." message.
 For example, look at the following definitions in a file called test.hs:
 
-    ps :: String -> IO ()
-    ps = putStrLn
-
-    ps2 :: a -> IO ()
-    ps2 _ = putStrLn "hello, world"
-
-    main :: IO ()
-    main = _ "hello, world"
-
-The hole in `main` would generate the message:
-
-    Valid substitutions include
-      ps :: String -> IO () ((defined at test.hs:2:1)
-      putStrLn :: String -> IO ()
-        (imported from ‘Prelude’ at test.hs:1:1
-         (and originally defined in ‘System.IO’))
-      putStr :: String -> IO ()
-        (imported from ‘Prelude’ at test.hs:1:1
-         (and originally defined in ‘System.IO’))
-
-Valid substitutions are found by checking names in scope.
-
-Currently the implementation only looks at exact type matches, as given by
-`tcEqType`, so we DO NOT report `ps2` as a valid substitution in the example,
-even though it fits in the hole. To determine that `ps2` fits in the hole,
-we would need to check ids for subsumption, i.e. that the type of the hole is
-a subtype of the id. This can be done using `tcSubType` from `TcUnify` and
-`tcCheckSatisfiability` in `TcSimplify`.  Unfortunately, `TcSimplify` uses
-`TcErrors` to report errors found during constraint checking, so checking for
-subsumption in holes would involve shuffling some code around in `TcSimplify`,
-to make a non-error reporting constraint satisfiability checker which could
-then be used for checking whether a given id satisfies the constraints imposed
-by the hole.
+   import Data.List (inits)
+
+   f :: [String]
+   f = _ "hello, world"
+
+The hole in `f` would generate the message:
+
+  Valid substitutions include
+    inits :: forall a. [a] -> [[a]]
+      (imported from ‘Data.List’ at tp.hs:3:19-23
+       (and originally defined in ‘base-4.10.0.0:Data.OldList’))
+    fail :: forall (m :: * -> *). Monad m => forall a. String -> m a
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘GHC.Base’))
+    mempty :: forall a. Monoid a => a
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘GHC.Base’))
+    pure :: forall (f :: * -> *). Applicative f => forall a. a -> f a
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘GHC.Base’))
+    return :: forall (m :: * -> *). Monad m => forall a. a -> m a
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘GHC.Base’))
+    read :: forall a. Read a => String -> a
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘Text.Read’))
+    lines :: String -> [String]
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘base-4.10.0.0:Data.OldList’))
+    words :: String -> [String]
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘base-4.10.0.0:Data.OldList’))
+    error :: forall (a :: TYPE r).  GHC.Stack.Types.HasCallStack => [Char] -> a
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘GHC.Err’))
+    errorWithoutStackTrace :: forall (a :: TYPE r). [Char] -> a
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘GHC.Err’))
+    undefined :: forall (a :: TYPE r).  GHC.Stack.Types.HasCallStack => a
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘GHC.Err’))
+    repeat :: forall a. a -> [a]
+      (imported from ‘Prelude’ at tp.hs:1:8-9
+       (and originally defined in ‘GHC.List’))
+
+Valid substitutions are found by checking top level ids in scope, and checking
+whether their type subsumes the type of the hole. We remove ids that are
+local bindings, since they are already included in the relevant bindings
+section of the hole error message.
 
 Note [Constraints include ...]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
index 1ae809f..a29ad92 100644 (file)
@@ -102,6 +102,7 @@ module TcRnTypes(
         pprCtOrigin, pprCtLoc,
         pushErrCtxt, pushErrCtxtSameOrigin,
 
+
         SkolemInfo(..), pprSigSkolInfo, pprSkolInfo,
         termEvidenceAllowed,
 
@@ -110,6 +111,8 @@ module TcRnTypes(
         isWanted, isGiven, isDerived, isGivenOrWDeriv,
         ctEvRole,
 
+        wrapType,
+
         -- Constraint solver plugins
         TcPlugin(..), TcPluginResult(..), TcPluginSolver,
         TcPluginM, runTcPluginM, unsafeTcPluginTcM,
@@ -2484,6 +2487,18 @@ pprEvVarTheta ev_vars = pprTheta (map evVarPred ev_vars)
 pprEvVarWithType :: EvVar -> SDoc
 pprEvVarWithType v = ppr v <+> dcolon <+> pprType (evVarPred v)
 
+
+
+-- | Wraps the given type with the constraints (via ic_given) in the given
+-- implication, according to the variables mentioned (via ic_skols)
+-- in the implication.
+wrapType :: Type -> Implication -> Type
+wrapType ty (Implic {ic_skols = skols, ic_given=givens}) =
+    wrapWithAllSkols $ mkFunTys (map idType givens) $ ty
+    where forAllTy :: Type -> TyVar -> Type
+          forAllTy ty tv = mkForAllTy tv Specified ty
+          wrapWithAllSkols ty = foldl forAllTy ty skols
+
 {-
 ************************************************************************
 *                                                                      *
index 37cc77c..943c596 100644 (file)
@@ -9,6 +9,7 @@ module TcSimplify(
        simplifyInteractive, solveEqualities,
        simplifyWantedsTcM,
        tcCheckSatisfiability,
+       tcSubsumes,
 
        -- For Rules we need these
        solveWanteds, solveWantedsAndDrop,
@@ -44,6 +45,7 @@ import TrieMap       () -- DV: for now
 import Type
 import TysWiredIn    ( liftedRepTy )
 import Unify         ( tcMatchTyKi )
+import TcUnify       ( tcSubType_NC )
 import Util
 import Var
 import VarSet
@@ -481,6 +483,24 @@ simplifyDefault theta
        ; traceTc "reportUnsolved }" empty
        ; return () }
 
+-- | Reports whether first type (ty_a) subsumes the second type (ty_b),
+-- discarding any errors. Subsumption here means that the ty_b can fit into the
+-- ty_a, i.e. `tcSubsumes a b == True` if b is a subtype of a.
+-- N.B.: Make sure that the types contain all the constraints
+-- contained in any associated implications.
+tcSubsumes :: TcSigmaType -> TcSigmaType -> TcM Bool
+tcSubsumes ty_a ty_b | ty_a `eqType` ty_b = return True
+tcSubsumes ty_a ty_b = discardErrs $
+ do {  (_, wanted, _) <- pushLevelAndCaptureConstraints $
+                           tcSubType_NC ExprSigCtxt ty_b ty_a
+    ; (rem, _) <- runTcS (simpl_top wanted)
+    -- We don't want any insoluble or simple constraints left,
+    -- but solved implications are ok (and neccessary for e.g. undefined)
+    ; return (isEmptyBag (wc_simple rem)
+         && isEmptyBag (wc_insol rem)
+         && allBag (isSolvedStatus . ic_status) (wc_impl rem))
+    }
+
 ------------------
 tcCheckSatisfiability :: Bag EvVar -> TcM Bool
 -- Return True if satisfiable, False if definitely contradictory
diff --git a/compiler/typecheck/TcSimplify.hs-boot b/compiler/typecheck/TcSimplify.hs-boot
new file mode 100644 (file)
index 0000000..a131bb3
--- /dev/null
@@ -0,0 +1,9 @@
+module TcSimplify where
+
+import GhcPrelude
+import TcRnTypes  ( TcM )
+import TcType ( TcSigmaType )
+
+-- This boot file exists solely to make tcSubsume avaialble in TcErrors
+
+tcSubsumes :: TcSigmaType -> TcSigmaType -> TcM Bool
index 729b5c4..6585f66 100644 (file)
@@ -4,3 +4,15 @@ T12468.hs:9:7: error:
     • In the expression: _
       In an equation for ‘f’: f I = _
     • Relevant bindings include f :: T a -> a (bound at T12468.hs:9:1)
+      Valid substitutions include
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at T12468.hs:3:8-13
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at T12468.hs:3:8-13
+           (and originally defined in ‘GHC.Enum’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T12468.hs:3:8-13
+           (and originally defined in ‘GHC.Err’))
index 9de7323..e1ca96c 100644 (file)
@@ -12,3 +12,8 @@
       In an equation for ‘it’: it = Just <$> _
     • Relevant bindings include
         it :: f (Maybe a) (bound at <interactive>:2:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ (and originally defined in ‘GHC.Err’))
index ade9950..e5eb289 100644 (file)
@@ -6,3 +6,8 @@
     • In the expression: _
       In an equation for ‘it’: it = _
     • Relevant bindings include it :: t (bound at <interactive>:1:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ (and originally defined in ‘GHC.Err’))
index 863a64f..766fc1e 100644 (file)
@@ -9,7 +9,19 @@ Defer03.hs:7:5: warning: [-Wtyped-holes (in -Wdefault)]
     • In the expression: _
       In an equation for ‘f’: f = _
     • Relevant bindings include f :: Int (bound at Defer03.hs:7:1)
-      Valid substitutions include a :: Int (defined at Defer03.hs:4:1)
+      Valid substitutions include
+        a :: Int (defined at Defer03.hs:4:1)
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Err’))
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
 
 Defer03.hs:4:5: error:
     • Couldn't match expected type ‘Int’ with actual type ‘Char’
@@ -21,7 +33,19 @@ Defer03.hs:7:5: error:
     • In the expression: _
       In an equation for ‘f’: f = _
     • Relevant bindings include f :: Int (bound at Defer03.hs:7:1)
-      Valid substitutions include a :: Int (defined at Defer03.hs:4:1)
+      Valid substitutions include
+        a :: Int (defined at Defer03.hs:4:1)
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Err’))
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
 
 Defer03.hs:4:5: warning: [-Wdeferred-type-errors (in -Wdefault)]
     • Couldn't match expected type ‘Int’ with actual type ‘Char’
@@ -33,7 +57,19 @@ Defer03.hs:7:5: warning: [-Wtyped-holes (in -Wdefault)]
     • In the expression: _
       In an equation for ‘f’: f = _
     • Relevant bindings include f :: Int (bound at Defer03.hs:7:1)
-      Valid substitutions include a :: Int (defined at Defer03.hs:4:1)
+      Valid substitutions include
+        a :: Int (defined at Defer03.hs:4:1)
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Err’))
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
 
 Defer03.hs:4:5: error:
     • Couldn't match expected type ‘Int’ with actual type ‘Char’
@@ -45,7 +81,19 @@ Defer03.hs:7:5: error:
     • In the expression: _
       In an equation for ‘f’: f = _
     • Relevant bindings include f :: Int (bound at Defer03.hs:7:1)
-      Valid substitutions include a :: Int (defined at Defer03.hs:4:1)
+      Valid substitutions include
+        a :: Int (defined at Defer03.hs:4:1)
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Err’))
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
 
 Defer03.hs:4:5: warning: [-Wdeferred-type-errors (in -Wdefault)]
     • Couldn't match expected type ‘Int’ with actual type ‘Char’
@@ -57,4 +105,16 @@ Defer03.hs:7:5: warning: [-Wtyped-holes (in -Wdefault)]
     • In the expression: _
       In an equation for ‘f’: f = _
     • Relevant bindings include f :: Int (bound at Defer03.hs:7:1)
-      Valid substitutions include a :: Int (defined at Defer03.hs:4:1)
+      Valid substitutions include
+        a :: Int (defined at Defer03.hs:4:1)
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Err’))
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at Defer03.hs:1:8-11
+           (and originally defined in ‘GHC.Enum’))
index 7c95534..4d592ce 100644 (file)
@@ -10,3 +10,9 @@ mod71.hs:4:9: error:
     • Relevant bindings include
         x :: t1 -> t -> t2 (bound at mod71.hs:4:3)
         f :: (t1 -> t -> t2) -> t2 (bound at mod71.hs:4:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at mod71.hs:3:8
+           (and originally defined in ‘GHC.Err’))
index ddd6824..df83c1a 100644 (file)
@@ -7,3 +7,9 @@ T12531.hs:6:11: warning: [-Wtyped-holes (in -Wdefault)]
     • Relevant bindings include
         x :: Int# (bound at T12531.hs:6:3)
         f :: Int# -> Int (bound at T12531.hs:6:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T12531.hs:3:8-13
+           (and originally defined in ‘GHC.Err’))
index e255178..0ac32fa 100644 (file)
@@ -10,6 +10,12 @@ T10267.hs:8:1: error:
     • Relevant bindings include
         x :: a (bound at T10267.hs:8:1)
         j :: a -> a (bound at T10267.hs:8:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T10267.hs:3:8-13
+           (and originally defined in ‘GHC.Err’))
 
 T10267.hs:8:1: error:
     • Found hole: _foo :: a -> a
@@ -21,6 +27,18 @@ T10267.hs:8:1: error:
     • In the expression: _foo
       In an equation for ‘i’: i = _foo
     • Relevant bindings include i :: a -> a (bound at T10267.hs:8:1)
+      Valid substitutions include
+        l :: forall a. a -> a (defined at T10267.hs:23:3)
+        k :: forall a. a -> a (defined at T10267.hs:14:3)
+        foo :: forall a. a -> a (defined at T10267.hs:33:1)
+        id :: forall a. a -> a
+          (imported from ‘Prelude’ at T10267.hs:3:8-13
+           (and originally defined in ‘GHC.Base’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T10267.hs:3:8-13
+           (and originally defined in ‘GHC.Err’))
 
 T10267.hs:14:3: error:
     • Found hole: _foo :: a -> a
@@ -32,6 +50,17 @@ T10267.hs:14:3: error:
     • In the expression: _foo
       In an equation for ‘k’: k = _foo
     • Relevant bindings include k :: a -> a (bound at T10267.hs:14:3)
+      Valid substitutions include
+        l :: forall a. a -> a (defined at T10267.hs:23:3)
+        foo :: forall a. a -> a (defined at T10267.hs:33:1)
+        id :: forall a. a -> a
+          (imported from ‘Prelude’ at T10267.hs:3:8-13
+           (and originally defined in ‘GHC.Base’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T10267.hs:3:8-13
+           (and originally defined in ‘GHC.Err’))
 
 T10267.hs:23:3: error:
     • Found hole: _ :: a
@@ -44,3 +73,9 @@ T10267.hs:23:3: error:
     • Relevant bindings include
         x :: a (bound at T10267.hs:23:3)
         l :: a -> a (bound at T10267.hs:23:3)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T10267.hs:3:8-13
+           (and originally defined in ‘GHC.Err’))
index 723bdf0..4f9410e 100644 (file)
@@ -8,6 +8,60 @@ T13050.hs:4:9: warning: [-Wtyped-holes (in -Wdefault)]
         y :: Int (bound at T13050.hs:4:5)
         x :: Int (bound at T13050.hs:4:3)
         f :: Int -> Int -> Int (bound at T13050.hs:4:1)
+      Valid substitutions include
+        (-) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        asTypeOf :: forall a. a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Base’))
+        const :: forall a b. a -> b -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Base’))
+        (*) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        (+) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        subtract :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        (^) :: forall a b. (Num a, Integral b) => a -> b -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        div :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        gcd :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        lcm :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        mod :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        quot :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        rem :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Err’))
+        max :: forall a. Ord a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Classes’))
+        min :: forall a. Ord a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Classes’))
+        seq :: forall a b. a -> b -> b
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Prim’))
 
 T13050.hs:5:11: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: Int -> Int -> Int
@@ -20,6 +74,59 @@ T13050.hs:5:11: warning: [-Wtyped-holes (in -Wdefault)]
         g :: Int -> Int -> Int (bound at T13050.hs:5:1)
       Valid substitutions include
         f :: Int -> Int -> Int (defined at T13050.hs:4:1)
+        (-) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        asTypeOf :: forall a. a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Base’))
+        const :: forall a b. a -> b -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Base’))
+        (*) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        (+) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        subtract :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        (^) :: forall a b. (Num a, Integral b) => a -> b -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        div :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        gcd :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        lcm :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        mod :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        quot :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        rem :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Err’))
+        max :: forall a. Ord a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Classes’))
+        min :: forall a. Ord a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Classes’))
+        seq :: forall a b. a -> b -> b
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Prim’))
 
 T13050.hs:6:11: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _a :: Int -> Int -> Int
@@ -34,3 +141,56 @@ T13050.hs:6:11: warning: [-Wtyped-holes (in -Wdefault)]
       Valid substitutions include
         f :: Int -> Int -> Int (defined at T13050.hs:4:1)
         g :: Int -> Int -> Int (defined at T13050.hs:5:1)
+        (-) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        asTypeOf :: forall a. a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Base’))
+        const :: forall a b. a -> b -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Base’))
+        (*) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        (+) :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        subtract :: forall a. Num a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Num’))
+        (^) :: forall a b. (Num a, Integral b) => a -> b -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        div :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        gcd :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        lcm :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        mod :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        quot :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        rem :: forall a. Integral a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Real’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Err’))
+        max :: forall a. Ord a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Classes’))
+        min :: forall a. Ord a => a -> a -> a
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Classes’))
+        seq :: forall a b. a -> b -> b
+          (imported from ‘Prelude’ at T13050.hs:1:8-17
+           (and originally defined in ‘GHC.Prim’))
index ddbb5b9..413aad2 100644 (file)
@@ -5,3 +5,15 @@ T9497a.hs:2:8: warning: [-Wtyped-holes (in -Wdefault)]
     • In the expression: _main
       In an equation for ‘main’: main = _main
     • Relevant bindings include main :: IO () (bound at T9497a.hs:2:1)
+      Valid substitutions include
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at T9497a.hs:1:1
+           (and originally defined in ‘GHC.Base’))
+        readLn :: forall a. Read a => IO a
+          (imported from ‘Prelude’ at T9497a.hs:1:1
+           (and originally defined in ‘System.IO’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T9497a.hs:1:1
+           (and originally defined in ‘GHC.Err’))
index bcd6a43..ddf2376 100644 (file)
@@ -383,13 +383,13 @@ test('T7050', normal, compile, ['-O'])
 test('T7312', normal, compile, [''])
 test('T7384', normal, compile, [''])
 test('T7451', normal, compile, [''])
-test('holes', normal, compile, ['-fdefer-type-errors'])
-test('holes2', normal, compile, ['-fdefer-type-errors'])
-test('holes3', normal, compile_fail, [''])
-test('hole_constraints', normal, compile, ['-fdefer-type-errors'])
-test('hole_constraints_nested', normal, compile, ['-fdefer-type-errors'])
+test('holes', normal, compile, ['-fdefer-type-errors -fno-max-valid-substitutions'])
+test('holes2', normal, compile, ['-fdefer-type-errors -fno-max-valid-substitutions'])
+test('holes3', normal, compile_fail, ['-fno-max-valid-substitutions'])
+test('hole_constraints', normal, compile, ['-fdefer-type-errors -fno-max-valid-substitutions'])
+test('hole_constraints_nested', normal, compile, ['-fdefer-type-errors -fno-max-valid-substitutions'])
 test('valid_substitutions', [extra_files(['ValidSubs.hs'])],
-    multimod_compile, ['valid_substitutions','-fdefer-type-errors'])
+    multimod_compile, ['valid_substitutions','-fdefer-type-errors -fno-max-valid-substitutions'])
 test('T7408', normal, compile, [''])
 test('UnboxStrictPrimitiveFields', normal, compile, [''])
 test('T7541', normal, compile, [''])
@@ -535,7 +535,7 @@ test('T12911', normal, compile, [''])
 test('T12925', normal, compile, [''])
 test('T12919', expect_broken(12919), compile, [''])
 test('T12936', normal, compile, [''])
-test('T13050', normal, compile, ['-fdefer-type-errors'])
+test('T13050', normal, compile, ['-fdefer-type-errors -fno-max-valid-substitutions'])
 test('T13083', normal, compile, [''])
 test('T11723', normal, compile, [''])
 test('T12987', normal, compile, [''])
index b464547..98d76ce 100644 (file)
@@ -10,6 +10,12 @@ hole_constraints.hs:8:6: warning: [-Wtyped-holes (in -Wdefault)]
     • Relevant bindings include
         f1 :: a (bound at hole_constraints.hs:8:1)
       Constraints include Eq a (from hole_constraints.hs:7:1-15)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at hole_constraints.hs:3:8-22
+           (and originally defined in ‘GHC.Err’))
 
 hole_constraints.hs:12:6: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: a
@@ -24,6 +30,13 @@ hole_constraints.hs:12:6: warning: [-Wtyped-holes (in -Wdefault)]
       Constraints include
         Show a (from hole_constraints.hs:11:1-25)
         Eq a (from hole_constraints.hs:11:1-25)
+      Valid substitutions include
+        f1 :: forall a. Eq a => a (defined at hole_constraints.hs:8:1)
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at hole_constraints.hs:3:8-22
+           (and originally defined in ‘GHC.Err’))
 
 hole_constraints.hs:16:35: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: [a]
@@ -35,6 +48,15 @@ hole_constraints.hs:16:35: warning: [-Wtyped-holes (in -Wdefault)]
     • Relevant bindings include
         f3 :: [a] (bound at hole_constraints.hs:16:30)
       Constraints include Eq a (from hole_constraints.hs:16:10-22)
+      Valid substitutions include
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at hole_constraints.hs:3:8-22
+           (and originally defined in ‘GHC.Base’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at hole_constraints.hs:3:8-22
+           (and originally defined in ‘GHC.Err’))
 
 hole_constraints.hs:20:19: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: a
@@ -48,6 +70,12 @@ hole_constraints.hs:20:19: warning: [-Wtyped-holes (in -Wdefault)]
         x :: a (bound at hole_constraints.hs:20:15)
         castWith :: (a :~: b) -> a -> b (bound at hole_constraints.hs:20:1)
       Constraints include b ~ a (from hole_constraints.hs:20:10-13)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at hole_constraints.hs:3:8-22
+           (and originally defined in ‘GHC.Err’))
 
 hole_constraints.hs:27:32: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: String
@@ -59,3 +87,16 @@ hole_constraints.hs:27:32: warning: [-Wtyped-holes (in -Wdefault)]
         a :: AnyShow (bound at hole_constraints.hs:27:5)
         foo :: AnyShow -> String (bound at hole_constraints.hs:27:1)
       Constraints include Show a (from hole_constraints.hs:27:19-27)
+      Valid substitutions include
+        f1 :: forall a. Eq a => a (defined at hole_constraints.hs:8:1)
+        f2 :: forall a. (Show a, Eq a) => a
+          (defined at hole_constraints.hs:12:1)
+        f3 :: forall a. C a => a (defined at hole_constraints.hs:15:17)
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at hole_constraints.hs:3:8-22
+           (and originally defined in ‘GHC.Base’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at hole_constraints.hs:3:8-22
+           (and originally defined in ‘GHC.Err’))
index b41aec8..a3fbbc6 100644 (file)
@@ -13,3 +13,15 @@ hole_constraints_nested.hs:12:16: warning: [-Wtyped-holes (in -Wdefault)]
         Eq a (from hole_constraints_nested.hs:12:7-11)
         Ord a (from hole_constraints_nested.hs:12:7-11)
         b ~ a (from hole_constraints_nested.hs:11:5-8)
+      Valid substitutions include
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at hole_constraints_nested.hs:3:8-28
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at hole_constraints_nested.hs:3:8-28
+           (and originally defined in ‘GHC.Enum’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at hole_constraints_nested.hs:3:8-28
+           (and originally defined in ‘GHC.Err’))
index aadc844..16d8ab7 100644 (file)
@@ -6,6 +6,12 @@ holes.hs:3:5: warning: [-Wtyped-holes (in -Wdefault)]
     • In the expression: _
       In an equation for ‘f’: f = _
     • Relevant bindings include f :: t (bound at holes.hs:3:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes.hs:1:8-12
+           (and originally defined in ‘GHC.Err’))
 
 holes.hs:6:7: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: Char
@@ -14,6 +20,19 @@ holes.hs:6:7: warning: [-Wtyped-holes (in -Wdefault)]
     • Relevant bindings include
         x :: Int (bound at holes.hs:6:3)
         g :: Int -> Char (bound at holes.hs:6:1)
+      Valid substitutions include
+        f :: forall t. t (defined at holes.hs:3:1)
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at holes.hs:1:8-12
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at holes.hs:1:8-12
+           (and originally defined in ‘GHC.Enum’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes.hs:1:8-12
+           (and originally defined in ‘GHC.Err’))
 
 holes.hs:8:5: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: [Char]
@@ -21,6 +40,16 @@ holes.hs:8:5: warning: [-Wtyped-holes (in -Wdefault)]
       In the expression: _ ++ "a"
       In an equation for ‘h’: h = _ ++ "a"
     • Relevant bindings include h :: [Char] (bound at holes.hs:8:1)
+      Valid substitutions include
+        f :: forall t. t (defined at holes.hs:3:1)
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at holes.hs:1:8-12
+           (and originally defined in ‘GHC.Base’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes.hs:1:8-12
+           (and originally defined in ‘GHC.Err’))
 
 holes.hs:11:15: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: b0
@@ -31,3 +60,14 @@ holes.hs:11:15: warning: [-Wtyped-holes (in -Wdefault)]
     • Relevant bindings include
         y :: [a] (bound at holes.hs:11:3)
         z :: [a] -> [a] (bound at holes.hs:11:1)
+      Valid substitutions include
+        f :: forall t. t (defined at holes.hs:3:1)
+        g :: Int -> Char (defined at holes.hs:6:1)
+        toEnum :: forall a. Enum a => Int -> a
+          (imported from ‘Prelude’ at holes.hs:1:8-12
+           (and originally defined in ‘GHC.Enum’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes.hs:1:8-12
+           (and originally defined in ‘GHC.Err’))
index 3744ef7..d7484fa 100644 (file)
@@ -4,11 +4,12 @@ holes2.hs:3:5: warning: [-Wdeferred-type-errors (in -Wdefault)]
       prevents the constraint ‘(Show a0)’ from being solved.
       Probable fix: use a type annotation to specify what ‘a0’ should be.
       These potential instances exist:
+        instance (Show b, Show a) => Show (Either a b)
+          -- Defined in ‘Data.Either’
         instance Show Ordering -- Defined in ‘GHC.Show’
         instance Show Integer -- Defined in ‘GHC.Show’
-        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
-        ...plus 22 others
-        ...plus six instances involving out-of-scope types
+        ...plus 23 others
+        ...plus 61 instances involving out-of-scope types
         (use -fprint-potential-instances to see them all)
     • In the expression: show _
       In an equation for ‘f’: f = show _
@@ -20,3 +21,12 @@ holes2.hs:3:10: warning: [-Wtyped-holes (in -Wdefault)]
       In the expression: show _
       In an equation for ‘f’: f = show _
     • Relevant bindings include f :: String (bound at holes2.hs:3:1)
+      Valid substitutions include
+        pi :: forall a. Floating a => a
+          (imported from ‘Prelude’ at holes2.hs:1:8-13
+           (and originally defined in ‘GHC.Float’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes2.hs:1:8-13
+           (and originally defined in ‘GHC.Err’))
index 3a3fd57..76b6bbf 100644 (file)
@@ -6,6 +6,12 @@ holes3.hs:3:5: error:
     • In the expression: _
       In an equation for ‘f’: f = _
     • Relevant bindings include f :: t (bound at holes3.hs:3:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes3.hs:1:8-13
+           (and originally defined in ‘GHC.Err’))
 
 holes3.hs:6:7: error:
     • Found hole: _gr :: Char
@@ -15,6 +21,19 @@ holes3.hs:6:7: error:
     • Relevant bindings include
         x :: Int (bound at holes3.hs:6:3)
         g :: Int -> Char (bound at holes3.hs:6:1)
+      Valid substitutions include
+        f :: forall t. t (defined at holes3.hs:3:1)
+        maxBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at holes3.hs:1:8-13
+           (and originally defined in ‘GHC.Enum’))
+        minBound :: forall a. Bounded a => a
+          (imported from ‘Prelude’ at holes3.hs:1:8-13
+           (and originally defined in ‘GHC.Enum’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes3.hs:1:8-13
+           (and originally defined in ‘GHC.Err’))
 
 holes3.hs:8:5: error:
     • Found hole: _aa :: [Char]
@@ -23,6 +42,16 @@ holes3.hs:8:5: error:
       In the expression: _aa ++ "a"
       In an equation for ‘h’: h = _aa ++ "a"
     • Relevant bindings include h :: [Char] (bound at holes3.hs:8:1)
+      Valid substitutions include
+        f :: forall t. t (defined at holes3.hs:3:1)
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at holes3.hs:1:8-13
+           (and originally defined in ‘GHC.Base’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes3.hs:1:8-13
+           (and originally defined in ‘GHC.Err’))
 
 holes3.hs:11:15: error:
     • Found hole: _x :: b0
@@ -34,3 +63,14 @@ holes3.hs:11:15: error:
     • Relevant bindings include
         y :: [a] (bound at holes3.hs:11:3)
         z :: [a] -> [a] (bound at holes3.hs:11:1)
+      Valid substitutions include
+        f :: forall t. t (defined at holes3.hs:3:1)
+        g :: Int -> Char (defined at holes3.hs:6:1)
+        toEnum :: forall a. Enum a => Int -> a
+          (imported from ‘Prelude’ at holes3.hs:1:8-13
+           (and originally defined in ‘GHC.Enum’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at holes3.hs:1:8-13
+           (and originally defined in ‘GHC.Err’))
index a89c5f0..a0de0e2 100644 (file)
@@ -11,6 +11,17 @@ valid_substitutions.hs:13:8: warning: [-Wtyped-holes (in -Wdefault)]
       In an equation for ‘test’: test = _
     • Relevant bindings include
         test :: [Maybe a] -> [a] (bound at valid_substitutions.hs:13:1)
+      Valid substitutions include
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at valid_substitutions.hs:3:1-30
+           (and originally defined in ‘GHC.Base’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at valid_substitutions.hs:3:1-30
+           (and originally defined in ‘GHC.Err’))
+        catMaybes :: forall a. [Maybe a] -> [a]
+          (imported from ‘Data.Maybe’ at valid_substitutions.hs:5:1-17)
 
 valid_substitutions.hs:16:9: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: Integer -> ValidSubs.Moo
@@ -20,7 +31,11 @@ valid_substitutions.hs:16:9: warning: [-Wtyped-holes (in -Wdefault)]
         test2 :: Integer -> ValidSubs.Moo
           (bound at valid_substitutions.hs:16:1)
       Valid substitutions include
-        ValidSubs.Moo :: Integer -> ValidSubs.Moo
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at valid_substitutions.hs:3:1-30
+           (and originally defined in ‘GHC.Err’))
 
 valid_substitutions.hs:19:8: warning: [-Wtyped-holes (in -Wdefault)]
     • Found hole: _ :: [Char] -> IO ()
@@ -33,5 +48,28 @@ valid_substitutions.hs:19:8: warning: [-Wtyped-holes (in -Wdefault)]
         ps :: String -> IO () (defined at valid_substitutions.hs:9:1)
         System.IO.putStr :: String -> IO ()
           (imported qualified from ‘System.IO’ at valid_substitutions.hs:4:1-26)
+        fail :: forall (m :: * -> *). Monad m => forall a. String -> m a
+          (imported from ‘Prelude’ at valid_substitutions.hs:3:1-30
+           (and originally defined in ‘GHC.Base’))
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at valid_substitutions.hs:3:1-30
+           (and originally defined in ‘GHC.Base’))
+        print :: forall a. Show a => a -> IO ()
+          (imported qualified from ‘System.IO’ at valid_substitutions.hs:4:1-26)
         putStrLn :: String -> IO ()
           (imported qualified from ‘System.IO’ at valid_substitutions.hs:4:1-26)
+        readIO :: forall a. Read a => String -> IO a
+          (imported qualified from ‘System.IO’ at valid_substitutions.hs:4:1-26)
+        error :: forall (a :: TYPE r).
+                 GHC.Stack.Types.HasCallStack =>
+                 [Char] -> a
+          (imported from ‘Prelude’ at valid_substitutions.hs:3:1-30
+           (and originally defined in ‘GHC.Err’))
+        errorWithoutStackTrace :: forall (a :: TYPE r). [Char] -> a
+          (imported from ‘Prelude’ at valid_substitutions.hs:3:1-30
+           (and originally defined in ‘GHC.Err’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at valid_substitutions.hs:3:1-30
+           (and originally defined in ‘GHC.Err’))
index ae57dec..45a55cf 100644 (file)
@@ -9,6 +9,12 @@ T12177.hs:3:19: error:
     • Relevant bindings include
         x :: p1 (bound at T12177.hs:3:14)
         bar :: p -> p1 -> t (bound at T12177.hs:3:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T12177.hs:1:8-10
+           (and originally defined in ‘GHC.Err’))
 
 T12177.hs:5:37: error:
     • Found hole: _ :: t
@@ -23,3 +29,9 @@ T12177.hs:5:37: error:
         x :: p3 (bound at T12177.hs:5:26)
         y :: p1 (bound at T12177.hs:5:14)
         baz :: p -> p1 -> p2 -> p3 -> p4 -> t (bound at T12177.hs:5:1)
+      Valid substitutions include
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T12177.hs:1:8-10
+           (and originally defined in ‘GHC.Err’))
index 46121be..a7b7bfb 100644 (file)
@@ -5,3 +5,15 @@ T9497d.hs:2:8: error:
     • In the expression: _main
       In an equation for ‘main’: main = _main
     • Relevant bindings include main :: IO () (bound at T9497d.hs:2:1)
+      Valid substitutions include
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at T9497d.hs:1:1
+           (and originally defined in ‘GHC.Base’))
+        readLn :: forall a. Read a => IO a
+          (imported from ‘Prelude’ at T9497d.hs:1:1
+           (and originally defined in ‘System.IO’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T9497d.hs:1:1
+           (and originally defined in ‘GHC.Err’))
index 9a7ac00..ad3a927 100644 (file)
@@ -1,8 +1,20 @@
 T9497a-run: T9497a-run.hs:2:8: error:
-    Found hole: _main :: IO ()
-    Or perhaps ‘_main’ is mis-spelled, or not in scope
-    In the expression: _main
-    In an equation for ‘main’: main = _main
-    Relevant bindings include
-      main :: IO () (bound at T9497a-run.hs:2:1)
+    • Found hole: _main :: IO ()
+      Or perhaps ‘_main’ is mis-spelled, or not in scope
+    • In the expression: _main
+      In an equation for ‘main’: main = _main
+    • Relevant bindings include
+        main :: IO () (bound at T9497a-run.hs:2:1)
+      Valid substitutions include
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at T9497a-run.hs:1:1
+           (and originally defined in ‘GHC.Base’))
+        readLn :: forall a. Read a => IO a
+          (imported from ‘Prelude’ at T9497a-run.hs:1:1
+           (and originally defined in ‘System.IO’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T9497a-run.hs:1:1
+           (and originally defined in ‘GHC.Err’))
 (deferred type error)
index 432b5fe..8836ee2 100644 (file)
@@ -1,8 +1,20 @@
 T9497b-run: T9497b-run.hs:2:8: error:
-    Found hole: _main :: IO ()
-    Or perhaps ‘_main’ is mis-spelled, or not in scope
-    In the expression: _main
-    In an equation for ‘main’: main = _main
-    Relevant bindings include
-      main :: IO () (bound at T9497b-run.hs:2:1)
+    • Found hole: _main :: IO ()
+      Or perhaps ‘_main’ is mis-spelled, or not in scope
+    • In the expression: _main
+      In an equation for ‘main’: main = _main
+    • Relevant bindings include
+        main :: IO () (bound at T9497b-run.hs:2:1)
+      Valid substitutions include
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at T9497b-run.hs:1:1
+           (and originally defined in ‘GHC.Base’))
+        readLn :: forall a. Read a => IO a
+          (imported from ‘Prelude’ at T9497b-run.hs:1:1
+           (and originally defined in ‘System.IO’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T9497b-run.hs:1:1
+           (and originally defined in ‘GHC.Err’))
 (deferred type error)
index 61d8575..829abf5 100644 (file)
@@ -1,8 +1,20 @@
 T9497c-run: T9497c-run.hs:2:8: error:
-    Found hole: _main :: IO ()
-    Or perhaps ‘_main’ is mis-spelled, or not in scope
-    In the expression: _main
-    In an equation for ‘main’: main = _main
-    Relevant bindings include
-      main :: IO () (bound at T9497c-run.hs:2:1)
+    • Found hole: _main :: IO ()
+      Or perhaps ‘_main’ is mis-spelled, or not in scope
+    • In the expression: _main
+      In an equation for ‘main’: main = _main
+    • Relevant bindings include
+        main :: IO () (bound at T9497c-run.hs:2:1)
+      Valid substitutions include
+        mempty :: forall a. Monoid a => a
+          (imported from ‘Prelude’ at T9497c-run.hs:1:1
+           (and originally defined in ‘GHC.Base’))
+        readLn :: forall a. Read a => IO a
+          (imported from ‘Prelude’ at T9497c-run.hs:1:1
+           (and originally defined in ‘System.IO’))
+        undefined :: forall (a :: TYPE r).
+                     GHC.Stack.Types.HasCallStack =>
+                     a
+          (imported from ‘Prelude’ at T9497c-run.hs:1:1
+           (and originally defined in ‘GHC.Err’))
 (deferred type error)