Simon Peyton Jones pushed to branch wip/T26015 at Glasgow Haskell Compiler / GHC

Commits:

14 changed files:

Changes:

  • compiler/GHC/HsToCore/Pmc/Solver/Types.hs
    ... ... @@ -64,7 +64,7 @@ import GHC.Builtin.Names
    64 64
     import GHC.Builtin.Types
    
    65 65
     import GHC.Builtin.Types.Prim
    
    66 66
     import GHC.Tc.Solver.InertSet (InertSet, emptyInert)
    
    67
    -import GHC.Tc.Utils.TcType (isStringTy)
    
    67
    +import GHC.Tc.Utils.TcType (isStringTy, topTcLevel)
    
    68 68
     import GHC.Types.CompleteMatch
    
    69 69
     import GHC.Types.SourceText (SourceText(..), mkFractionalLit, FractionalLit
    
    70 70
                                 , fractionalLitFromRational
    
    ... ... @@ -129,7 +129,7 @@ instance Outputable TyState where
    129 129
       ppr (TySt n inert) = ppr n <+> ppr inert
    
    130 130
     
    
    131 131
     initTyState :: TyState
    
    132
    -initTyState = TySt 0 emptyInert
    
    132
    +initTyState = TySt 0 (emptyInert topTcLevel)
    
    133 133
     
    
    134 134
     -- | The term oracle state. Stores 'VarInfo' for encountered 'Id's. These
    
    135 135
     -- entries are possibly shared when we figure out that two variables must be
    

  • compiler/GHC/Runtime/Eval.hs
    ... ... @@ -23,7 +23,7 @@ module GHC.Runtime.Eval (
    23 23
             setupBreakpoint,
    
    24 24
             back, forward,
    
    25 25
             setContext, getContext,
    
    26
    -        mkTopLevEnv,
    
    26
    +        mkTopLevEnv, mkTopLevImportedEnv,
    
    27 27
             getNamesInScope,
    
    28 28
             getRdrNamesInScope,
    
    29 29
             moduleIsInterpreted,
    
    ... ... @@ -836,29 +836,36 @@ mkTopLevEnv hsc_env modl
    836 836
           Nothing -> pure $ Left "not a home module"
    
    837 837
           Just details ->
    
    838 838
              case mi_top_env (hm_iface details) of
    
    839
    -                (IfaceTopEnv exports imports) -> do
    
    840
    -                  imports_env <-
    
    841
    -                        runInteractiveHsc hsc_env
    
    842
    -                      $ ioMsgMaybe $ hoistTcRnMessage $ runTcInteractive hsc_env
    
    843
    -                      $ fmap (foldr plusGlobalRdrEnv emptyGlobalRdrEnv)
    
    844
    -                      $ forM imports $ \iface_import -> do
    
    845
    -                        let ImpUserSpec spec details = tcIfaceImport iface_import
    
    846
    -                        iface <- loadInterfaceForModule (text "imported by GHCi") (is_mod spec)
    
    847
    -                        pure $ case details of
    
    848
    -                          ImpUserAll -> importsFromIface hsc_env iface spec Nothing
    
    849
    -                          ImpUserEverythingBut ns -> importsFromIface hsc_env iface spec (Just ns)
    
    850
    -                          ImpUserExplicit x _parents_of_implicits ->
    
    851
    -                            -- TODO: Not quite right, is_explicit should refer to whether the user wrote A(..) or A(x,y).
    
    852
    -                            -- It is only used for error messages. It seems dubious even to add an import context to these GREs as
    
    853
    -                            -- they are not "imported" into the top-level scope of the REPL. I changed this for now so that
    
    854
    -                            -- the test case produce the same output as before.
    
    855
    -                            let spec' = ImpSpec { is_decl = spec, is_item = ImpSome { is_explicit = True, is_iloc = noSrcSpan } }
    
    856
    -                            in mkGlobalRdrEnv $ gresFromAvails hsc_env (Just spec') x
    
    839
    +                (IfaceTopEnv exports _imports) -> do
    
    840
    +                  imports_env <- mkTopLevImportedEnv hsc_env details
    
    857 841
                       let exports_env = mkGlobalRdrEnv $ gresFromAvails hsc_env Nothing (getDetOrdAvails exports)
    
    858 842
                       pure $ Right $ plusGlobalRdrEnv imports_env exports_env
    
    859 843
       where
    
    860 844
         hpt = hsc_HPT hsc_env
    
    861 845
     
    
    846
    +-- | Make the top-level environment with all bindings imported by this module.
    
    847
    +-- Exported bindings from this module are not included in the result.
    
    848
    +mkTopLevImportedEnv :: HscEnv -> HomeModInfo -> IO GlobalRdrEnv
    
    849
    +mkTopLevImportedEnv hsc_env details = do
    
    850
    +    runInteractiveHsc hsc_env
    
    851
    +  $ ioMsgMaybe $ hoistTcRnMessage $ runTcInteractive hsc_env
    
    852
    +  $ fmap (foldr plusGlobalRdrEnv emptyGlobalRdrEnv)
    
    853
    +  $ forM imports $ \iface_import -> do
    
    854
    +    let ImpUserSpec spec details = tcIfaceImport iface_import
    
    855
    +    iface <- loadInterfaceForModule (text "imported by GHCi") (is_mod spec)
    
    856
    +    pure $ case details of
    
    857
    +      ImpUserAll -> importsFromIface hsc_env iface spec Nothing
    
    858
    +      ImpUserEverythingBut ns -> importsFromIface hsc_env iface spec (Just ns)
    
    859
    +      ImpUserExplicit x _parents_of_implicits ->
    
    860
    +        -- TODO: Not quite right, is_explicit should refer to whether the user wrote A(..) or A(x,y).
    
    861
    +        -- It is only used for error messages. It seems dubious even to add an import context to these GREs as
    
    862
    +        -- they are not "imported" into the top-level scope of the REPL. I changed this for now so that
    
    863
    +        -- the test case produce the same output as before.
    
    864
    +        let spec' = ImpSpec { is_decl = spec, is_item = ImpSome { is_explicit = True, is_iloc = noSrcSpan } }
    
    865
    +        in mkGlobalRdrEnv $ gresFromAvails hsc_env (Just spec') x
    
    866
    +  where
    
    867
    +    IfaceTopEnv _ imports = mi_top_env (hm_iface details)
    
    868
    +
    
    862 869
     -- | Get the interactive evaluation context, consisting of a pair of the
    
    863 870
     -- set of modules from which we take the full top-level scope, and the set
    
    864 871
     -- of modules from which we take just the exports respectively.
    

  • compiler/GHC/Tc/Solver.hs
    ... ... @@ -915,21 +915,22 @@ simplifyInfer top_lvl rhs_tclvl infer_mode sigs name_taus wanteds
    915 915
            ; let psig_theta = concatMap sig_inst_theta partial_sigs
    
    916 916
     
    
    917 917
            -- First do full-blown solving
    
    918
    -       -- NB: we must gather up all the bindings from doing
    
    919
    -       -- this solving; hence (runTcSWithEvBinds ev_binds_var).
    
    920
    -       -- And note that since there are nested implications,
    
    921
    -       -- calling solveWanteds will side-effect their evidence
    
    922
    -       -- bindings, so we can't just revert to the input
    
    923
    -       -- constraint.
    
    924
    -
    
    918
    +       -- NB: we must gather up all the bindings from doing this solving; hence
    
    919
    +       -- (runTcSWithEvBinds ev_binds_var).  And note that since there are
    
    920
    +       -- nested implications, calling solveWanteds will side-effect their
    
    921
    +       -- evidence bindings, so we can't just revert to the input constraint.
    
    922
    +       --
    
    923
    +       -- See also Note [Inferring principal types]
    
    925 924
            ; ev_binds_var <- TcM.newTcEvBinds
    
    926 925
            ; psig_evs     <- newWanteds AnnOrigin psig_theta
    
    927 926
            ; wanted_transformed
    
    928
    -            <- setTcLevel rhs_tclvl $
    
    929
    -               runTcSWithEvBinds ev_binds_var $
    
    927
    +            <- runTcSWithEvBinds ev_binds_var $
    
    928
    +               setTcLevelTcS rhs_tclvl        $
    
    930 929
                    solveWanteds (mkSimpleWC psig_evs `andWC` wanteds)
    
    930
    +               -- setLevelTcS: we do setLevel /inside/ the runTcS, so that
    
    931
    +               --              we initialise the InertSet inert_given_eq_lvl as far
    
    932
    +               --              out as possible, maximising oppportunities to unify
    
    931 933
                    -- psig_evs : see Note [Add signature contexts as wanteds]
    
    932
    -               -- See Note [Inferring principal types]
    
    933 934
     
    
    934 935
            -- Find quant_pred_candidates, the predicates that
    
    935 936
            -- we'll consider quantifying over
    
    ... ... @@ -1430,13 +1431,15 @@ decideAndPromoteTyVars top_lvl rhs_tclvl infer_mode name_taus psigs wanted
    1430 1431
     
    
    1431 1432
                  -- Step 1 of Note [decideAndPromoteTyVars]
    
    1432 1433
                  -- Get candidate constraints, decide which we can potentially quantify
    
    1433
    -             (can_quant_cts, no_quant_cts) = approximateWCX wanted
    
    1434
    +             -- The `no_quant_tvs` are free in constraints we can't quantify.
    
    1435
    +             (can_quant_cts, no_quant_tvs) = approximateWCX False wanted
    
    1434 1436
                  can_quant = ctsPreds can_quant_cts
    
    1435
    -             no_quant  = ctsPreds no_quant_cts
    
    1437
    +             can_quant_tvs = tyCoVarsOfTypes can_quant
    
    1436 1438
     
    
    1437 1439
                  -- Step 2 of Note [decideAndPromoteTyVars]
    
    1438 1440
                  -- Apply the monomorphism restriction
    
    1439 1441
                  (post_mr_quant, mr_no_quant) = applyMR dflags infer_mode can_quant
    
    1442
    +             mr_no_quant_tvs              = tyCoVarsOfTypes mr_no_quant
    
    1440 1443
     
    
    1441 1444
                  -- The co_var_tvs are tvs mentioned in the types of covars or
    
    1442 1445
                  -- coercion holes. We can't quantify over these covars, so we
    
    ... ... @@ -1448,30 +1451,33 @@ decideAndPromoteTyVars top_lvl rhs_tclvl infer_mode name_taus psigs wanted
    1448 1451
                                              ++ tau_tys ++ post_mr_quant)
    
    1449 1452
                  co_var_tvs = closeOverKinds co_vars
    
    1450 1453
     
    
    1451
    -             -- outer_tvs are mentioned in `wanted, and belong to some outer level.
    
    1454
    +             -- outer_tvs are mentioned in `wanted`, and belong to some outer level.
    
    1452 1455
                  -- We definitely can't quantify over them
    
    1453 1456
                  outer_tvs = outerLevelTyVars rhs_tclvl $
    
    1454
    -                         tyCoVarsOfTypes can_quant `unionVarSet` tyCoVarsOfTypes no_quant
    
    1457
    +                         can_quant_tvs `unionVarSet` no_quant_tvs
    
    1455 1458
     
    
    1456
    -             -- Step 3 of Note [decideAndPromoteTyVars]
    
    1459
    +             -- Step 3 of Note [decideAndPromoteTyVars], (a-c)
    
    1457 1460
                  -- Identify mono_tvs: the type variables that we must not quantify over
    
    1461
    +             -- At top level we are much less keen to create mono tyvars, to avoid
    
    1462
    +             -- spooky action at a distance.
    
    1458 1463
                  mono_tvs_without_mr
    
    1459
    -               | is_top_level = outer_tvs
    
    1460
    -               | otherwise    = outer_tvs                                 -- (a)
    
    1461
    -                                `unionVarSet` tyCoVarsOfTypes no_quant    -- (b)
    
    1462
    -                                `unionVarSet` co_var_tvs                  -- (c)
    
    1464
    +               | is_top_level = outer_tvs    -- See (DP2)
    
    1465
    +               | otherwise    = outer_tvs                    -- (a)
    
    1466
    +                                `unionVarSet` no_quant_tvs   -- (b)
    
    1467
    +                                `unionVarSet` co_var_tvs     -- (c)
    
    1463 1468
     
    
    1469
    +             -- Step 3 of Note [decideAndPromoteTyVars], (d)
    
    1464 1470
                  mono_tvs_with_mr
    
    1465 1471
                    = -- Even at top level, we don't quantify over type variables
    
    1466 1472
                      -- mentioned in constraints that the MR tells us not to quantify
    
    1467 1473
                      -- See Note [decideAndPromoteTyVars] (DP2)
    
    1468
    -                 mono_tvs_without_mr `unionVarSet` tyCoVarsOfTypes mr_no_quant
    
    1474
    +                 mono_tvs_without_mr `unionVarSet` mr_no_quant_tvs
    
    1469 1475
     
    
    1470 1476
                  --------------------------------------------------------------------
    
    1471 1477
                  -- Step 4 of Note [decideAndPromoteTyVars]
    
    1472 1478
                  -- Use closeWrtFunDeps to find any other variables that are determined by mono_tvs
    
    1473
    -             add_determined tvs = closeWrtFunDeps post_mr_quant tvs
    
    1474
    -                                  `delVarSetList` psig_qtvs
    
    1479
    +             add_determined tvs preds = closeWrtFunDeps preds tvs
    
    1480
    +                                        `delVarSetList` psig_qtvs
    
    1475 1481
                      -- Why delVarSetList psig_qtvs?
    
    1476 1482
                      -- If the user has explicitly asked for quantification, then that
    
    1477 1483
                      -- request "wins" over the MR.
    
    ... ... @@ -1480,8 +1486,8 @@ decideAndPromoteTyVars top_lvl rhs_tclvl infer_mode name_taus psigs wanted
    1480 1486
                      -- (i.e. says "no" to isQuantifiableTv)? That's OK: explanation
    
    1481 1487
                      -- in Step 2 of Note [Deciding quantification].
    
    1482 1488
     
    
    1483
    -             mono_tvs_with_mr_det    = add_determined mono_tvs_with_mr
    
    1484
    -             mono_tvs_without_mr_det = add_determined mono_tvs_without_mr
    
    1489
    +             mono_tvs_with_mr_det    = add_determined mono_tvs_with_mr    post_mr_quant
    
    1490
    +             mono_tvs_without_mr_det = add_determined mono_tvs_without_mr can_quant
    
    1485 1491
     
    
    1486 1492
                  --------------------------------------------------------------------
    
    1487 1493
                  -- Step 5 of Note [decideAndPromoteTyVars]
    
    ... ... @@ -1518,7 +1524,7 @@ decideAndPromoteTyVars top_lvl rhs_tclvl infer_mode name_taus psigs wanted
    1518 1524
                , text "newly_mono_tvs =" <+> ppr newly_mono_tvs
    
    1519 1525
                , text "can_quant =" <+> ppr can_quant
    
    1520 1526
                , text "post_mr_quant =" <+> ppr post_mr_quant
    
    1521
    -           , text "no_quant =" <+> ppr no_quant
    
    1527
    +           , text "no_quant_tvs =" <+> ppr no_quant_tvs
    
    1522 1528
                , text "mr_no_quant =" <+> ppr mr_no_quant
    
    1523 1529
                , text "final_quant =" <+> ppr final_quant
    
    1524 1530
                , text "co_vars =" <+> ppr co_vars ]
    
    ... ... @@ -1605,8 +1611,8 @@ The plan
    1605 1611
       The body of z tries to unify the type of x (call it alpha[1]) with
    
    1606 1612
       (beta[2] -> gamma[2]). This unification fails because alpha is untouchable, leaving
    
    1607 1613
            [W] alpha[1] ~ (beta[2] -> gamma[2])
    
    1608
    -  We need to know not to quantify over beta or gamma, because they are in the
    
    1609
    -  equality constraint with alpha. Actual test case:   typecheck/should_compile/tc213
    
    1614
    +  We don't want to quantify over beta or gamma because they are fixed by alpha,
    
    1615
    +  which is monomorphic. Actual test case:   typecheck/should_compile/tc213
    
    1610 1616
     
    
    1611 1617
       Another example. Suppose we have
    
    1612 1618
           class C a b | a -> b
    
    ... ... @@ -1643,9 +1649,22 @@ Wrinkles
    1643 1649
       promote type variables.  But for bindings affected by the MR we have no choice
    
    1644 1650
       but to promote.
    
    1645 1651
     
    
    1652
    +  An example is in #26004.
    
    1653
    +      f w e = case e of
    
    1654
    +        T1 -> let y = not w in False
    
    1655
    +        T2 -> True
    
    1656
    +  When generalising `f` we have a constraint
    
    1657
    +      forall. (a ~ Bool) => alpha ~ Bool
    
    1658
    +  where our provisional type for `f` is `f :: T alpha -> blah`.
    
    1659
    +  In a /nested/ setting, we might simply not-generalise `f`, hoping to learn
    
    1660
    +  about `alpha` from f's call sites (test T5266b is an example).  But at top
    
    1661
    +  level, to avoid spooky action at a distance.
    
    1662
    +
    
    1646 1663
     Note [The top-level Any principle]
    
    1647 1664
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    1648
    -Key principle: we never want to show the programmer a type with `Any` in it.
    
    1665
    +Key principles:
    
    1666
    +  * we never want to show the programmer a type with `Any` in it.
    
    1667
    +  * avoid "spooky action at a distance" and silent defaulting
    
    1649 1668
     
    
    1650 1669
     Most /top level/ bindings have a type signature, so none of this arises.  But
    
    1651 1670
     where a top-level binding lacks a signature, we don't want to infer a type like
    
    ... ... @@ -1654,11 +1673,18 @@ and then subsequently default alpha[0]:=Any. Exposing `Any` to the user is bad
    1654 1673
     bad bad.  Better to report an error, which is what may well happen if we
    
    1655 1674
     quantify over alpha instead.
    
    1656 1675
     
    
    1676
    +Moreover,
    
    1677
    + * If (elsewhere in this module) we add a call to `f`, say (f True), then
    
    1678
    +   `f` will get the type `Bool -> Int`
    
    1679
    + * If we add /another/ call, say (f 'x'), we will then get a type error.
    
    1680
    + * If we have no calls, the final exported type of `f` may get set by
    
    1681
    +   defaulting, and might not be principal (#26004).
    
    1682
    +
    
    1657 1683
     For /nested/ bindings, a monomorphic type like `f :: alpha[0] -> Int` is fine,
    
    1658 1684
     because we can see all the call sites of `f`, and they will probably fix
    
    1659 1685
     `alpha`.  In contrast, we can't see all of (or perhaps any of) the calls of
    
    1660 1686
     top-level (exported) functions, reducing the worries about "spooky action at a
    
    1661
    -distance".
    
    1687
    +distance".  This also moves in the direction of `MonoLocalBinds`, which we like.
    
    1662 1688
     
    
    1663 1689
     Note [Do not quantify over constraints that determine a variable]
    
    1664 1690
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    

  • compiler/GHC/Tc/Solver/InertSet.hs
    ... ... @@ -374,20 +374,20 @@ instance Outputable InertSet where
    374 374
              where
    
    375 375
                dicts = bagToList (dictsToBag solved_dicts)
    
    376 376
     
    
    377
    -emptyInertCans :: InertCans
    
    378
    -emptyInertCans
    
    377
    +emptyInertCans :: TcLevel -> InertCans
    
    378
    +emptyInertCans given_eq_lvl
    
    379 379
       = IC { inert_eqs          = emptyTyEqs
    
    380 380
            , inert_funeqs       = emptyFunEqs
    
    381
    -       , inert_given_eq_lvl = topTcLevel
    
    381
    +       , inert_given_eq_lvl = given_eq_lvl
    
    382 382
            , inert_given_eqs    = False
    
    383 383
            , inert_dicts        = emptyDictMap
    
    384 384
            , inert_safehask     = emptyDictMap
    
    385 385
            , inert_insts        = []
    
    386 386
            , inert_irreds       = emptyBag }
    
    387 387
     
    
    388
    -emptyInert :: InertSet
    
    389
    -emptyInert
    
    390
    -  = IS { inert_cans           = emptyInertCans
    
    388
    +emptyInert :: TcLevel -> InertSet
    
    389
    +emptyInert given_eq_lvl
    
    390
    +  = IS { inert_cans           = emptyInertCans given_eq_lvl
    
    391 391
            , inert_cycle_breakers = emptyBag :| []
    
    392 392
            , inert_famapp_cache   = emptyFunEqs
    
    393 393
            , inert_solved_dicts   = emptyDictMap }
    
    ... ... @@ -678,6 +678,23 @@ should update inert_given_eq_lvl?
    678 678
        imply nominal ones. For example, if (G a ~R G b) and G's argument's
    
    679 679
        role is nominal, then we can deduce a ~N b.
    
    680 680
     
    
    681
    +(TGE6) A subtle point is this: when initialising the solver, giving it
    
    682
    +   an empty InertSet, we must conservatively initialise `inert_given_lvl`
    
    683
    +   to the /current/ TcLevel.  This matters when doing let-generalisation.
    
    684
    +   Consider #26004:
    
    685
    +      f w e = case e of
    
    686
    +                  T1 -> let y = not w in False   -- T1 is a GADT
    
    687
    +                  T2 -> True
    
    688
    +   When let-generalising `y`, we will have (w :: alpha[1]) in the type
    
    689
    +   envt; and we are under GADT pattern match.  So when we solve the
    
    690
    +   constraints from y's RHS, in simplifyInfer, we must NOT unify
    
    691
    +       alpha[1] := Bool
    
    692
    +   Since we don't know what enclosing equalities there are, we just
    
    693
    +   conservatively assume that there are some.
    
    694
    +
    
    695
    +   This initialisation in done in `runTcSWithEvBinds`, which passes
    
    696
    +   the current TcLevl to `emptyInert`.
    
    697
    +
    
    681 698
     Historical note: prior to #24938 we also ignored Given equalities that
    
    682 699
     did not mention an "outer" type variable.  But that is wrong, as #24938
    
    683 700
     showed. Another example is immortalised in test LocalGivenEqs2
    

  • compiler/GHC/Tc/Solver/Monad.hs
    ... ... @@ -20,7 +20,7 @@ module GHC.Tc.Solver.Monad (
    20 20
         runTcSSpecPrag,
    
    21 21
         failTcS, warnTcS, addErrTcS, wrapTcS, ctLocWarnTcS,
    
    22 22
         runTcSEqualities,
    
    23
    -    nestTcS, nestImplicTcS, setEvBindsTcS,
    
    23
    +    nestTcS, nestImplicTcS, setEvBindsTcS, setTcLevelTcS,
    
    24 24
         emitImplicationTcS, emitTvImplicationTcS,
    
    25 25
         emitImplication,
    
    26 26
         emitFunDepWanteds,
    
    ... ... @@ -947,8 +947,9 @@ added. This is initialised from the innermost implication constraint.
    947 947
     -- | See Note [TcSMode]
    
    948 948
     data TcSMode
    
    949 949
       = TcSVanilla    -- ^ Normal constraint solving
    
    950
    +  | TcSPMCheck    -- ^ Used when doing patterm match overlap checks
    
    950 951
       | TcSEarlyAbort -- ^ Abort early on insoluble constraints
    
    951
    -  | TcSSpecPrag -- ^ Fully solve all constraints
    
    952
    +  | TcSSpecPrag   -- ^ Fully solve all constraints
    
    952 953
       deriving (Eq)
    
    953 954
     
    
    954 955
     {- Note [TcSMode]
    
    ... ... @@ -957,6 +958,11 @@ The constraint solver can operate in different modes:
    957 958
     
    
    958 959
     * TcSVanilla: Normal constraint solving mode. This is the default.
    
    959 960
     
    
    961
    +* TcSPMCheck: Used by the pattern match overlap checker.
    
    962
    +      Like TcSVanilla, but the idea is that the returned InertSet will
    
    963
    +      later be resumed, so we do not want to restore type-equality cycles
    
    964
    +      See also Note [Type equality cycles] in GHC.Tc.Solver.Equality
    
    965
    +
    
    960 966
     * TcSEarlyAbort: Abort (fail in the monad) as soon as we come across an
    
    961 967
       insoluble constraint. This is used to fail-fast when checking for hole-fits.
    
    962 968
       See Note [Speeding up valid hole-fits].
    
    ... ... @@ -1135,7 +1141,7 @@ runTcS tcs
    1135 1141
     runTcSEarlyAbort :: TcS a -> TcM a
    
    1136 1142
     runTcSEarlyAbort tcs
    
    1137 1143
       = do { ev_binds_var <- TcM.newTcEvBinds
    
    1138
    -       ; runTcSWithEvBinds' True TcSEarlyAbort ev_binds_var tcs }
    
    1144
    +       ; runTcSWithEvBinds' TcSEarlyAbort ev_binds_var tcs }
    
    1139 1145
     
    
    1140 1146
     -- | Run the 'TcS' monad in 'TcSSpecPrag' mode, which either fully solves
    
    1141 1147
     -- individual Wanted quantified constraints or leaves them alone.
    
    ... ... @@ -1143,7 +1149,7 @@ runTcSEarlyAbort tcs
    1143 1149
     -- See Note [TcSSpecPrag].
    
    1144 1150
     runTcSSpecPrag :: EvBindsVar -> TcS a -> TcM a
    
    1145 1151
     runTcSSpecPrag ev_binds_var tcs
    
    1146
    -  = runTcSWithEvBinds' True TcSSpecPrag ev_binds_var tcs
    
    1152
    +  = runTcSWithEvBinds' TcSSpecPrag ev_binds_var tcs
    
    1147 1153
     
    
    1148 1154
     {- Note [TcSSpecPrag]
    
    1149 1155
     ~~~~~~~~~~~~~~~~~~~~~
    
    ... ... @@ -1200,7 +1206,7 @@ runTcSEqualities thing_inside
    1200 1206
     runTcSInerts :: InertSet -> TcS a -> TcM (a, InertSet)
    
    1201 1207
     runTcSInerts inerts tcs = do
    
    1202 1208
       ev_binds_var <- TcM.newTcEvBinds
    
    1203
    -  runTcSWithEvBinds' False TcSVanilla ev_binds_var $ do
    
    1209
    +  runTcSWithEvBinds' TcSPMCheck ev_binds_var $ do
    
    1204 1210
         setInertSet inerts
    
    1205 1211
         a <- tcs
    
    1206 1212
         new_inerts <- getInertSet
    
    ... ... @@ -1209,21 +1215,23 @@ runTcSInerts inerts tcs = do
    1209 1215
     runTcSWithEvBinds :: EvBindsVar
    
    1210 1216
                       -> TcS a
    
    1211 1217
                       -> TcM a
    
    1212
    -runTcSWithEvBinds = runTcSWithEvBinds' True TcSVanilla
    
    1218
    +runTcSWithEvBinds = runTcSWithEvBinds' TcSVanilla
    
    1213 1219
     
    
    1214
    -runTcSWithEvBinds' :: Bool  -- True <=> restore type equality cycles
    
    1215
    -                           -- Don't if you want to reuse the InertSet.
    
    1216
    -                           -- See also Note [Type equality cycles]
    
    1217
    -                           -- in GHC.Tc.Solver.Equality
    
    1218
    -                   -> TcSMode
    
    1220
    +runTcSWithEvBinds' :: TcSMode
    
    1219 1221
                        -> EvBindsVar
    
    1220 1222
                        -> TcS a
    
    1221 1223
                        -> TcM a
    
    1222
    -runTcSWithEvBinds' restore_cycles mode ev_binds_var tcs
    
    1224
    +runTcSWithEvBinds' mode ev_binds_var tcs
    
    1223 1225
       = do { unified_var <- TcM.newTcRef 0
    
    1224
    -       ; step_count <- TcM.newTcRef 0
    
    1225
    -       ; inert_var <- TcM.newTcRef emptyInert
    
    1226
    -       ; wl_var <- TcM.newTcRef emptyWorkList
    
    1226
    +       ; step_count  <- TcM.newTcRef 0
    
    1227
    +
    
    1228
    +       -- Make a fresh, empty inert set
    
    1229
    +       -- Subtle point: see (TGE6) in Note [Tracking Given equalities]
    
    1230
    +       --               in GHC.Tc.Solver.InertSet
    
    1231
    +       ; tc_lvl      <- TcM.getTcLevel
    
    1232
    +       ; inert_var   <- TcM.newTcRef (emptyInert tc_lvl)
    
    1233
    +
    
    1234
    +       ; wl_var      <- TcM.newTcRef emptyWorkList
    
    1227 1235
            ; unif_lvl_var <- TcM.newTcRef Nothing
    
    1228 1236
            ; let env = TcSEnv { tcs_ev_binds           = ev_binds_var
    
    1229 1237
                               , tcs_unified            = unified_var
    
    ... ... @@ -1240,9 +1248,13 @@ runTcSWithEvBinds' restore_cycles mode ev_binds_var tcs
    1240 1248
            ; when (count > 0) $
    
    1241 1249
              csTraceTcM $ return (text "Constraint solver steps =" <+> int count)
    
    1242 1250
     
    
    1243
    -       ; when restore_cycles $
    
    1244
    -         do { inert_set <- TcM.readTcRef inert_var
    
    1245
    -            ; restoreTyVarCycles inert_set }
    
    1251
    +       -- Restore tyvar cycles: see Note [Type equality cycles] in
    
    1252
    +       --                       GHC.Tc.Solver.Equality
    
    1253
    +       -- But /not/ in TCsPMCheck mode: see Note [TcSMode]
    
    1254
    +       ; case mode of
    
    1255
    +            TcSPMCheck -> return ()
    
    1256
    +            _ -> do { inert_set <- TcM.readTcRef inert_var
    
    1257
    +                    ; restoreTyVarCycles inert_set }
    
    1246 1258
     
    
    1247 1259
     #if defined(DEBUG)
    
    1248 1260
            ; ev_binds <- TcM.getTcEvBindsMap ev_binds_var
    
    ... ... @@ -1284,6 +1296,10 @@ setEvBindsTcS :: EvBindsVar -> TcS a -> TcS a
    1284 1296
     setEvBindsTcS ref (TcS thing_inside)
    
    1285 1297
      = TcS $ \ env -> thing_inside (env { tcs_ev_binds = ref })
    
    1286 1298
     
    
    1299
    +setTcLevelTcS :: TcLevel -> TcS a -> TcS a
    
    1300
    +setTcLevelTcS lvl (TcS thing_inside)
    
    1301
    + = TcS $ \ env -> TcM.setTcLevel lvl (thing_inside env)
    
    1302
    +
    
    1287 1303
     nestImplicTcS :: EvBindsVar
    
    1288 1304
                   -> TcLevel -> TcS a
    
    1289 1305
                   -> TcS a
    

  • compiler/GHC/Tc/Types/Constraint.hs
    ... ... @@ -1181,9 +1181,12 @@ dropMisleading (WC { wc_simple = simples, wc_impl = implics, wc_errors = errors
    1181 1181
                , wc_impl   = mapBag drop_implic implics
    
    1182 1182
                , wc_errors  = filterBag keep_delayed_error errors }
    
    1183 1183
     
    
    1184
    -    keep_ct ct = case classifyPredType (ctPred ct) of
    
    1185
    -                    ClassPred {} -> False
    
    1186
    -                    _ -> True
    
    1184
    +    keep_ct ct
    
    1185
    +      = case classifyPredType (ctPred ct) of
    
    1186
    +           ClassPred cls _ -> isEqualityClass cls
    
    1187
    +             -- isEqualityClass: see (CERR2) in Note [Constraints and errors]
    
    1188
    +             --                  in GHC.Tc.Utils.Monad
    
    1189
    +           _ -> True
    
    1187 1190
     
    
    1188 1191
         keep_delayed_error (DE_Hole hole) = isOutOfScopeHole hole
    
    1189 1192
         keep_delayed_error (DE_NotConcrete {}) = True
    
    ... ... @@ -1743,24 +1746,21 @@ will be able to report a more informative error:
    1743 1746
     ************************************************************************
    
    1744 1747
     -}
    
    1745 1748
     
    
    1746
    -type ApproxWC = ( Bag Ct    -- Free quantifiable constraints
    
    1747
    -                , Bag Ct )  -- Free non-quantifiable constraints
    
    1748
    -                            -- due to shape, or enclosing equality
    
    1749
    +type ApproxWC = ( Bag Ct          -- Free quantifiable constraints
    
    1750
    +                , TcTyCoVarSet )  -- Free vars of non-quantifiable constraints
    
    1751
    +                                  -- due to shape, or enclosing equality
    
    1749 1752
     
    
    1750 1753
     approximateWC :: Bool -> WantedConstraints -> Bag Ct
    
    1751 1754
     approximateWC include_non_quantifiable cts
    
    1752
    -  | include_non_quantifiable = quant `unionBags` no_quant
    
    1753
    -  | otherwise                = quant
    
    1754
    -  where
    
    1755
    -    (quant, no_quant) = approximateWCX cts
    
    1755
    +  = fst (approximateWCX include_non_quantifiable cts)
    
    1756 1756
     
    
    1757
    -approximateWCX :: WantedConstraints -> ApproxWC
    
    1757
    +approximateWCX :: Bool -> WantedConstraints -> ApproxWC
    
    1758 1758
     -- The "X" means "extended";
    
    1759 1759
     --    we return both quantifiable and non-quantifiable constraints
    
    1760 1760
     -- See Note [ApproximateWC]
    
    1761 1761
     -- See Note [floatKindEqualities vs approximateWC]
    
    1762
    -approximateWCX wc
    
    1763
    -  = float_wc False emptyVarSet wc (emptyBag, emptyBag)
    
    1762
    +approximateWCX include_non_quantifiable wc
    
    1763
    +  = float_wc False emptyVarSet wc (emptyBag, emptyVarSet)
    
    1764 1764
       where
    
    1765 1765
         float_wc :: Bool           -- True <=> there are enclosing equalities
    
    1766 1766
                  -> TcTyCoVarSet   -- Enclosing skolem binders
    
    ... ... @@ -1786,17 +1786,23 @@ approximateWCX wc
    1786 1786
                -- There can be (insoluble) Given constraints in wc_simple,
    
    1787 1787
                -- there so that we get error reports for unreachable code
    
    1788 1788
                -- See `given_insols` in GHC.Tc.Solver.Solve.solveImplication
    
    1789
    -       | insolubleCt ct                              = acc
    
    1790
    -       | tyCoVarsOfCt ct `intersectsVarSet` skol_tvs = acc
    
    1791
    -       | otherwise
    
    1792
    -       = case classifyPredType (ctPred ct) of
    
    1789
    +       | insolubleCt ct                       = acc
    
    1790
    +       | pred_tvs `intersectsVarSet` skol_tvs = acc
    
    1791
    +       | include_non_quantifiable             = add_to_quant
    
    1792
    +       | is_quantifiable encl_eqs (ctPred ct) = add_to_quant
    
    1793
    +       | otherwise                            = add_to_no_quant
    
    1794
    +       where
    
    1795
    +         pred     = ctPred ct
    
    1796
    +         pred_tvs = tyCoVarsOfType pred
    
    1797
    +         add_to_quant    = (ct `consBag` quant, no_quant)
    
    1798
    +         add_to_no_quant = (quant, no_quant `unionVarSet` pred_tvs)
    
    1799
    +
    
    1800
    +    is_quantifiable encl_eqs pred
    
    1801
    +       = case classifyPredType pred of
    
    1793 1802
                -- See the classification in Note [ApproximateWC]
    
    1794 1803
                EqPred eq_rel ty1 ty2
    
    1795
    -             | not encl_eqs      -- See Wrinkle (W1)
    
    1796
    -             , quantify_equality eq_rel ty1 ty2
    
    1797
    -             -> add_to_quant
    
    1798
    -             | otherwise
    
    1799
    -             -> add_to_no_quant
    
    1804
    +             | encl_eqs  -> False  -- encl_eqs: See Wrinkle (W1)
    
    1805
    +             | otherwise -> quantify_equality eq_rel ty1 ty2
    
    1800 1806
     
    
    1801 1807
                ClassPred cls tys
    
    1802 1808
                  | Just {} <- isCallStackPred cls tys
    
    ... ... @@ -1804,17 +1810,14 @@ approximateWCX wc
    1804 1810
                    -- the constraints bubble up to be solved from the outer
    
    1805 1811
                    -- context, or be defaulted when we reach the top-level.
    
    1806 1812
                    -- See Note [Overview of implicit CallStacks] in GHC.Tc.Types.Evidence
    
    1807
    -             -> add_to_no_quant
    
    1813
    +             -> False
    
    1808 1814
     
    
    1809 1815
                  | otherwise
    
    1810
    -             -> add_to_quant  -- See Wrinkle (W2)
    
    1816
    +             -> True  -- See Wrinkle (W2)
    
    1811 1817
     
    
    1812
    -           IrredPred {}  -> add_to_quant  -- See Wrinkle (W2)
    
    1818
    +           IrredPred {}  -> True  -- See Wrinkle (W2)
    
    1813 1819
     
    
    1814
    -           ForAllPred {} -> add_to_no_quant  -- Never quantify these
    
    1815
    -       where
    
    1816
    -         add_to_quant    = (ct `consBag` quant, no_quant)
    
    1817
    -         add_to_no_quant = (quant, ct `consBag` no_quant)
    
    1820
    +           ForAllPred {} -> False  -- Never quantify these
    
    1818 1821
     
    
    1819 1822
         -- See Note [Quantifying over equality constraints]
    
    1820 1823
         quantify_equality NomEq  ty1 ty2 = quant_fun ty1 || quant_fun ty2
    
    ... ... @@ -1852,7 +1855,7 @@ We proceed by classifying the constraint:
    1852 1855
     
    
    1853 1856
     Wrinkle (W1)
    
    1854 1857
       When inferring most-general types (in simplifyInfer), we
    
    1855
    -  do *not* float an equality constraint if the implication binds
    
    1858
    +  do *not* quantify over equality constraint if the implication binds
    
    1856 1859
       equality constraints, because that defeats the OutsideIn story.
    
    1857 1860
       Consider data T a where { TInt :: T Int; MkT :: T a }
    
    1858 1861
              f TInt = 3::Int
    

  • compiler/GHC/Tc/Utils/Monad.hs
    ... ... @@ -1385,11 +1385,13 @@ tryCaptureConstraints thing_inside
    1385 1385
                               tcTryM thing_inside
    
    1386 1386
     
    
    1387 1387
            -- See Note [Constraints and errors]
    
    1388
    -       ; let lie_to_keep = case mb_res of
    
    1389
    -                             Nothing -> dropMisleading lie
    
    1390
    -                             Just {} -> lie
    
    1391
    -
    
    1392
    -       ; return (mb_res, lie_to_keep) }
    
    1388
    +       ; case mb_res of
    
    1389
    +            Just {} -> return (mb_res, lie)
    
    1390
    +            Nothing -> do { let pruned_lie = dropMisleading lie
    
    1391
    +                          ; traceTc "tryCaptureConstraints" $
    
    1392
    +                            vcat [ text "lie:" <+> ppr lie
    
    1393
    +                                 , text "dropMisleading lie:" <+> ppr pruned_lie ]
    
    1394
    +                          ; return (Nothing, pruned_lie) } }
    
    1393 1395
     
    
    1394 1396
     captureConstraints :: TcM a -> TcM (a, WantedConstraints)
    
    1395 1397
     -- (captureConstraints m) runs m, and returns the type constraints it generates
    
    ... ... @@ -2066,28 +2068,51 @@ It's distressingly delicate though:
    2066 2068
       emitted some constraints with skolem-escape problems.
    
    2067 2069
     
    
    2068 2070
     * If we discard too /few/ constraints, we may get the misleading
    
    2069
    -  class constraints mentioned above.  But we may /also/ end up taking
    
    2070
    -  constraints built at some inner level, and emitting them at some
    
    2071
    -  outer level, and then breaking the TcLevel invariants
    
    2072
    -  See Note [TcLevel invariants] in GHC.Tc.Utils.TcType
    
    2073
    -
    
    2074
    -So dropMisleading has a horridly ad-hoc structure.  It keeps only
    
    2075
    -/insoluble/ flat constraints (which are unlikely to very visibly trip
    
    2076
    -up on the TcLevel invariant, but all /implication/ constraints (except
    
    2077
    -the class constraints inside them).  The implication constraints are
    
    2078
    -OK because they set the ambient level before attempting to solve any
    
    2079
    -inner constraints.  Ugh! I hate this. But it seems to work.
    
    2080
    -
    
    2081
    -However note that freshly-generated constraints like (Int ~ Bool), or
    
    2082
    -((a -> b) ~ Int) are all CNonCanonical, and hence won't be flagged as
    
    2083
    -insoluble.  The constraint solver does that.  So they'll be discarded.
    
    2084
    -That's probably ok; but see th/5358 as a not-so-good example:
    
    2085
    -   t1 :: Int
    
    2086
    -   t1 x = x   -- Manifestly wrong
    
    2087
    -
    
    2088
    -   foo = $(...raises exception...)
    
    2089
    -We report the exception, but not the bug in t1.  Oh well.  Possible
    
    2090
    -solution: make GHC.Tc.Utils.Unify.uType spot manifestly-insoluble constraints.
    
    2071
    +  class constraints mentioned above.
    
    2072
    +
    
    2073
    +  We may /also/ end up taking constraints built at some inner level, and
    
    2074
    +  emitting them (via the exception catching in `tryCaptureConstraints` at some
    
    2075
    +  outer level, and then breaking the TcLevel invariants See Note [TcLevel
    
    2076
    +  invariants] in GHC.Tc.Utils.TcType
    
    2077
    +
    
    2078
    +So `dropMisleading` has a horridly ad-hoc structure:
    
    2079
    +
    
    2080
    +* It keeps only /insoluble/ flat constraints (which are unlikely to very visibly
    
    2081
    +  trip up on the TcLevel invariant
    
    2082
    +
    
    2083
    +* But it keeps all /implication/ constraints (except the class constraints
    
    2084
    +  inside them).  The implication constraints are OK because they set the ambient
    
    2085
    +  level before attempting to solve any inner constraints.
    
    2086
    +
    
    2087
    +Ugh! I hate this. But it seems to work.
    
    2088
    +
    
    2089
    +Other wrinkles
    
    2090
    +
    
    2091
    +(CERR1) Note that freshly-generated constraints like (Int ~ Bool), or
    
    2092
    +    ((a -> b) ~ Int) are all CNonCanonical, and hence won't be flagged as
    
    2093
    +    insoluble.  The constraint solver does that.  So they'll be discarded.
    
    2094
    +    That's probably ok; but see th/5358 as a not-so-good example:
    
    2095
    +       t1 :: Int
    
    2096
    +       t1 x = x   -- Manifestly wrong
    
    2097
    +
    
    2098
    +       foo = $(...raises exception...)
    
    2099
    +    We report the exception, but not the bug in t1.  Oh well.  Possible
    
    2100
    +    solution: make GHC.Tc.Utils.Unify.uType spot manifestly-insoluble constraints.
    
    2101
    +
    
    2102
    +(CERR2) In #26015 I found that from the constraints
    
    2103
    +           [W] alpha ~ Int      -- A class constraint
    
    2104
    +           [W] F alpha ~# Bool  -- An equality constraint
    
    2105
    +  we were dropping the first (becuase it's a class constraint) but not the
    
    2106
    +  second, and then getting a misleading error message from the second.  As
    
    2107
    +  #25607 shows, we can get not just one but a zillion bogus messages, which
    
    2108
    +  conceal the one genuine error.  Boo.
    
    2109
    +
    
    2110
    +  For now I have added an even more ad-hoc "drop class constraints except
    
    2111
    +  equality classes (~) and (~~)"; see `dropMisleading`.  That just kicks the can
    
    2112
    +  down the road; but this problem seems somewhat rare anyway.  The code in
    
    2113
    +  `dropMisleading` hasn't changed for years.
    
    2114
    +
    
    2115
    +It would be great to have a more systematic solution to this entire mess.
    
    2091 2116
     
    
    2092 2117
     
    
    2093 2118
     ************************************************************************
    

  • compiler/GHC/Types/Name/Occurrence.hs
    ... ... @@ -92,6 +92,7 @@ module GHC.Types.Name.Occurrence (
    92 92
             plusOccEnv, plusOccEnv_C,
    
    93 93
             extendOccEnv_Acc, filterOccEnv, delListFromOccEnv, delFromOccEnv,
    
    94 94
             alterOccEnv, minusOccEnv, minusOccEnv_C, minusOccEnv_C_Ns,
    
    95
    +        sizeOccEnv,
    
    95 96
             pprOccEnv, forceOccEnv,
    
    96 97
             intersectOccEnv_C,
    
    97 98
     
    
    ... ... @@ -803,6 +804,10 @@ minusOccEnv_C_Ns f (MkOccEnv as) (MkOccEnv bs) =
    803 804
                then Nothing
    
    804 805
                else Just m
    
    805 806
     
    
    807
    +sizeOccEnv :: OccEnv a -> Int
    
    808
    +sizeOccEnv (MkOccEnv as) =
    
    809
    +  nonDetStrictFoldUFM (\ m !acc -> acc + sizeUFM m) 0 as
    
    810
    +
    
    806 811
     instance Outputable a => Outputable (OccEnv a) where
    
    807 812
         ppr x = pprOccEnv ppr x
    
    808 813
     
    

  • testsuite/tests/typecheck/should_fail/T26004.hs
    1
    +{-# LANGUAGE GADTs #-}
    
    2
    +{-# LANGUAGE NoMonoLocalBinds #-}
    
    3
    +
    
    4
    +module T26004 where
    
    5
    +
    
    6
    +data T a where
    
    7
    +  T1 :: T Bool
    
    8
    +  T2 :: T a
    
    9
    +
    
    10
    +-- This funcion should be rejected:
    
    11
    +-- we should not infer a non-principal type for `f`
    
    12
    +f w e = case e of
    
    13
    +  T1 -> let y = not w in False
    
    14
    +  T2 -> True

  • testsuite/tests/typecheck/should_fail/T26004.stderr
    1
    +
    
    2
    +T26004.hs:13:21: error: [GHC-25897]
    
    3
    +    • Could not deduce ‘p ~ Bool’
    
    4
    +      from the context: a ~ Bool
    
    5
    +        bound by a pattern with constructor: T1 :: T Bool,
    
    6
    +                 in a case alternative
    
    7
    +        at T26004.hs:13:3-4
    
    8
    +      ‘p’ is a rigid type variable bound by
    
    9
    +        the inferred type of f :: p -> T a -> Bool
    
    10
    +        at T26004.hs:(12,1)-(14,12)
    
    11
    +    • In the first argument of ‘not’, namely ‘w’
    
    12
    +      In the expression: not w
    
    13
    +      In an equation for ‘y’: y = not w
    
    14
    +    • Relevant bindings include
    
    15
    +        w :: p (bound at T26004.hs:12:3)
    
    16
    +        f :: p -> T a -> Bool (bound at T26004.hs:12:1)
    
    17
    +    Suggested fix: Consider giving ‘f’ a type signature

  • testsuite/tests/typecheck/should_fail/T26015.hs
    1
    +{-# LANGUAGE MonoLocalBinds, GADTs, TypeFamilies #-}
    
    2
    +
    
    3
    +module Foo where
    
    4
    +
    
    5
    +type family F a
    
    6
    +type instance F Int = Bool
    
    7
    +
    
    8
    +data T where
    
    9
    +  T1 :: a -> T
    
    10
    +  T2 :: Int -> T
    
    11
    +
    
    12
    +woo :: (a ~ Int) => Int -> F a
    
    13
    +woo = error "urk"
    
    14
    +
    
    15
    +f x = case x of
    
    16
    +         T1 y -> not (woo 3)
    
    17
    +         T2 -> True

  • testsuite/tests/typecheck/should_fail/T26015.stderr
    1
    +T26015.hs:17:10: error: [GHC-27346]
    
    2
    +    • The data constructor ‘T2’ should have 1 argument, but has been given none
    
    3
    +    • In the pattern: T2
    
    4
    +      In a case alternative: T2 -> True
    
    5
    +      In the expression:
    
    6
    +        case x of
    
    7
    +          T1 y -> not (woo 3)
    
    8
    +          T2 -> True
    
    9
    +

  • testsuite/tests/typecheck/should_fail/T7453.stderr
    1
    -
    
    2
    -T7453.hs:9:15: error: [GHC-25897]
    
    3
    -    • Couldn't match type ‘t’ with ‘p’
    
    4
    -      Expected: Id t
    
    5
    -        Actual: Id p
    
    1
    +T7453.hs:10:30: error: [GHC-25897]
    
    2
    +    • Couldn't match expected type ‘t’ with actual type ‘p’
    
    6 3
           ‘t’ is a rigid type variable bound by
    
    7 4
             the type signature for:
    
    8 5
               z :: forall t. Id t
    
    ... ... @@ -10,29 +7,17 @@ T7453.hs:9:15: error: [GHC-25897]
    10 7
           ‘p’ is a rigid type variable bound by
    
    11 8
             the inferred type of cast1 :: p -> a
    
    12 9
             at T7453.hs:(7,1)-(10,30)
    
    13
    -    • In the expression: aux
    
    14
    -      In an equation for ‘z’:
    
    15
    -          z = aux
    
    16
    -            where
    
    17
    -                aux = Id v
    
    18
    -      In an equation for ‘cast1’:
    
    19
    -          cast1 v
    
    20
    -            = runId z
    
    21
    -            where
    
    22
    -                z :: Id t
    
    23
    -                z = aux
    
    24
    -                  where
    
    25
    -                      aux = Id v
    
    10
    +    • In the first argument of ‘Id’, namely ‘v’
    
    11
    +      In the expression: Id v
    
    12
    +      In an equation for ‘aux’: aux = Id v
    
    26 13
         • Relevant bindings include
    
    27
    -        aux :: Id p (bound at T7453.hs:10:21)
    
    14
    +        aux :: Id t (bound at T7453.hs:10:21)
    
    28 15
             z :: Id t (bound at T7453.hs:9:11)
    
    29 16
             v :: p (bound at T7453.hs:7:7)
    
    30 17
             cast1 :: p -> a (bound at T7453.hs:7:1)
    
    31 18
     
    
    32
    -T7453.hs:15:15: error: [GHC-25897]
    
    33
    -    • Couldn't match type ‘t1’ with ‘p’
    
    34
    -      Expected: () -> t1
    
    35
    -        Actual: () -> p
    
    19
    +T7453.hs:16:33: error: [GHC-25897]
    
    20
    +    • Couldn't match expected type ‘t1’ with actual type ‘p’
    
    36 21
           ‘t1’ is a rigid type variable bound by
    
    37 22
             the type signature for:
    
    38 23
               z :: forall t1. () -> t1
    
    ... ... @@ -40,21 +25,11 @@ T7453.hs:15:15: error: [GHC-25897]
    40 25
           ‘p’ is a rigid type variable bound by
    
    41 26
             the inferred type of cast2 :: p -> t
    
    42 27
             at T7453.hs:(13,1)-(16,33)
    
    43
    -    • In the expression: aux
    
    44
    -      In an equation for ‘z’:
    
    45
    -          z = aux
    
    46
    -            where
    
    47
    -                aux = const v
    
    48
    -      In an equation for ‘cast2’:
    
    49
    -          cast2 v
    
    50
    -            = z ()
    
    51
    -            where
    
    52
    -                z :: () -> t
    
    53
    -                z = aux
    
    54
    -                  where
    
    55
    -                      aux = const v
    
    28
    +    • In the first argument of ‘const’, namely ‘v’
    
    29
    +      In the expression: const v
    
    30
    +      In an equation for ‘aux’: aux = const v
    
    56 31
         • Relevant bindings include
    
    57
    -        aux :: forall {b}. b -> p (bound at T7453.hs:16:21)
    
    32
    +        aux :: b -> t1 (bound at T7453.hs:16:21)
    
    58 33
             z :: () -> t1 (bound at T7453.hs:15:11)
    
    59 34
             v :: p (bound at T7453.hs:13:7)
    
    60 35
             cast2 :: p -> t (bound at T7453.hs:13:1)
    
    ... ... @@ -86,3 +61,4 @@ T7453.hs:21:15: error: [GHC-25897]
    86 61
             z :: t1 (bound at T7453.hs:21:11)
    
    87 62
             v :: p (bound at T7453.hs:19:7)
    
    88 63
             cast3 :: p -> t (bound at T7453.hs:19:1)
    
    64
    +

  • testsuite/tests/typecheck/should_fail/all.T
    ... ... @@ -735,3 +735,4 @@ test('T24938', normal, compile_fail, [''])
    735 735
     test('T25325', normal, compile_fail, [''])
    
    736 736
     test('T25004', normal, compile_fail, [''])
    
    737 737
     test('T25004k', normal, compile_fail, [''])
    
    738
    +test('T26004', normal, compile_fail, [''])