Skip to content
Snippets Groups Projects
  1. Jul 05, 2023
    • sheaf's avatar
      Reinstate untouchable variable error messages · 2b55cb5f
      sheaf authored and Marge Bot's avatar Marge Bot committed
      This extra bit of information was accidentally being discarded after
      a refactoring of the way we reported problems when unifying a type
      variable with another type. This patch rectifies that.
      2b55cb5f
    • Vladislav Zavialov's avatar
      testsuite: Do not require CUSKs · 679bbc97
      Vladislav Zavialov authored and Marge Bot's avatar Marge Bot committed
      Numerous tests make use of CUSKs (complete user-supplied kinds),
      a legacy feature scheduled for deprecation. In order to proceed
      with the said deprecation, the tests have been updated to use SAKS
      instead (standalone kind signatures).
      
      This also allows us to remove the Haskell2010 language pragmas that
      were added in 115cd3c8 to work around the lack of CUSKs in GHC2021.
      679bbc97
  2. Jul 03, 2023
  3. Jun 17, 2023
    • Andrei Borzenkov's avatar
      Type/data instances: require that variables on the RHS are mentioned on the LHS (#23512) · 800aad7e
      Andrei Borzenkov authored and Marge Bot's avatar Marge Bot committed
      GHC Proposal #425 "Invisible binders in type declarations" restricts the
      scope of type and data family instances as follows:
      
        In type family and data family instances, require that every variable
        mentioned on the RHS must also occur on the LHS.
      
      For example, here are three equivalent type instance definitions accepted before this patch:
      
        type family F1 a :: k
        type instance F1 Int = Any :: j -> j
      
        type family F2 a :: k
        type instance F2 @(j -> j) Int = Any :: j -> j
      
        type family F3 a :: k
        type instance forall j. F3 Int = Any :: j -> j
      
      - In F1, j is implicitly quantified and it occurs only on the RHS;
      - In F2, j is implicitly quantified and it occurs both on the LHS and the RHS;
      - In F3, j is explicitly quantified.
      
      Now F1 is rejected with an out-of-scope error, while F2 and F3 continue to be accepted.
      800aad7e
  4. Jun 07, 2023
    • Vladislav Zavialov's avatar
      Invisible binders in type declarations (#22560) · 4aea0a72
      Vladislav Zavialov authored
      
      This patch implements @k-binders introduced in GHC Proposal #425
      and guarded behind the TypeAbstractions extension:
      
      	type D :: forall k j. k -> j -> Type
      	data D @k @j a b = ...
      	       ^^ ^^
      
      To represent the new syntax, we modify LHsQTyVars as follows:
      
      	-  hsq_explicit :: [LHsTyVarBndr () pass]
      	+  hsq_explicit :: [LHsTyVarBndr (HsBndrVis pass) pass]
      
      HsBndrVis is a new data type that records the distinction between
      type variable binders written with and without the @ sign:
      
      	data HsBndrVis pass
      	  = HsBndrRequired
      	  | HsBndrInvisible (LHsToken "@" pass)
      
      The rest of the patch updates GHC, template-haskell, and haddock
      to handle the new syntax.
      
      Parser:
        The PsErrUnexpectedTypeAppInDecl error message is removed.
        The syntax it used to reject is now permitted.
      
      Renamer:
        The @ sign does not affect the scope of a binder, so the changes to
        the renamer are minimal.  See rnLHsTyVarBndrVisFlag.
      
      Type checker:
        There are three code paths that were updated to deal with the newly
        introduced invisible type variable binders:
      
          1. checking SAKS: see kcCheckDeclHeader_sig, matchUpSigWithDecl
          2. checking CUSK: see kcCheckDeclHeader_cusk
          3. inference: see kcInferDeclHeader, rejectInvisibleBinders
      
        Helper functions bindExplicitTKBndrs_Q_Skol and bindExplicitTKBndrs_Q_Tv
        are generalized to work with HsBndrVis.
      
      Updates the haddock submodule.
      
      Metric Increase:
          MultiLayerModulesTH_OneShot
      
      Co-authored-by: default avatarSimon Peyton Jones <simon.peytonjones@gmail.com>
      4aea0a72
  5. May 24, 2023
    • Hai Nguyen Quang's avatar
      Migrate errors in GHC.Tc.Validity · 838aaf4b
      Hai Nguyen Quang authored and Marge Bot's avatar Marge Bot committed
      This patch migrates the error messages in GHC.Tc.Validity to use
      the new diagnostic infrastructure.
      
      It adds the constructors:
      
        - TcRnSimplifiableConstraint
        - TcRnArityMismatch
        - TcRnIllegalInstanceDecl, with sub-datatypes for HasField errors
          and fundep coverage condition errors.
      838aaf4b
  6. May 23, 2023
    • Simon Peyton Jones's avatar
      Add the SolverStage monad · e1590ddc
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      This refactoring makes a substantial improvement in the
      structure of the type-checker's constraint solver: #23070.
      
      Specifically:
      
      * Introduced the SolverStage monad.   See GHC.Tc.Solver.Monad
        Note [The SolverStage monad]
      
      * Make each solver pipeline (equalities, dictionaries, irreds etc)
        deal with updating the inert set, as a separate SolverStage.  There
        is sometimes special stuff to do, and it means that each full
        pipeline can have type SolverStage Void, indicating that they never
        return anything.
      
      * Made GHC.Tc.Solver.Equality.zonkEqTypes into a SolverStage.  Much nicer.
      
      * Combined the remnants of GHC.Tc.Solver.Canonical and
        GHC.Tc.Solver.Interact into a new module GHC.Tc.Solver.Solve.
        (Interact and Canonical are removed.)
      
      * Gave the same treatment to dictionary and irred constraints
        as I have already done for equality constraints:
          * New types (akin to EqCt): IrredCt and DictCt
          * Ct is now just a simple sum type
                data Ct
                  = CDictCan      DictCt
                  | CIrredCan     IrredCt
                  | CEqCan        EqCt
                  | CQuantCan     QCInst
                  | CNonCanonical CtEvidence
          * inert_dicts can now have the better type DictMap DictCt, instead of
            DictMap Ct; and similarly inert_irreds.
      
      * Significantly simplified the treatment of implicit parameters.
        Previously we had a number of special cases
          * interactGivenIP, an entire function
          * special case in maybeKickOut
          * special case in findDict, when looking up dictionaries
        But actually it's simpler than that. When adding a new Given, implicit
        parameter constraint to the InertSet, we just need to kick out any
        existing inert constraints that mention that implicit parameter.
      
        The main work is done in GHC.Tc.Solver.InertSet.delIPDict, along with
        its auxiliary GHC.Core.Predicate.mentionsIP.
      
        See Note [Shadowing of implicit parameters] in GHC.Tc.Solver.Dict.
      
      * Add a new fast-path in GHC.Tc.Errors.Hole.tcCheckHoleFit.
        See Note [Fast path for tcCheckHoleFit].  This is a big win in some cases:
        test hard_hole_fits gets nearly 40% faster (at compile time).
      
      * Add a new fast-path for solving /boxed/ equality constraints
        (t1 ~ t2).  See Note [Solving equality classes] in GHC.Tc.Solver.Dict.
        This makes a big difference too: test T17836 compiles 40% faster.
      
      * Implement the PermissivePlan of #23413, which concerns what happens with
        insoluble Givens.   Our previous treatment was wildly inconsistent as that
        ticket pointed out.
      
        A part of this, I simplified GHC.Tc.Validity.checkAmbiguity: now we simply
        don't run the ambiguity check at all if -XAllowAmbiguousTypes is on.
      
      Smaller points:
      
      * In `GHC.Tc.Errors.misMatchOrCND` instead of having a special case for
        insoluble /occurs/ checks, broaden in to all insouluble constraints.
        Just generally better. See Note [Insoluble mis-match] in that module.
      
      As noted above, compile time perf gets better.  Here are the changes
      over 0.5% on Fedora.  (The figures are slightly larger on Windows for
      some reason.)
      
      Metrics: compile_time/bytes allocated
      -------------------------------------
                      LargeRecord(normal)   -0.9%
      MultiLayerModulesTH_OneShot(normal)   +0.5%
                           T11822(normal)   -0.6%
                           T12227(normal)   -1.8% GOOD
                           T12545(normal)   -0.5%
                           T13035(normal)   -0.6%
                           T15703(normal)   -1.4% GOOD
                           T16875(normal)   -0.5%
                           T17836(normal)  -40.7% GOOD
                          T17836b(normal)  -12.3% GOOD
                          T17977b(normal)   -0.5%
                            T5837(normal)   -1.1%
                            T8095(normal)   -2.7% GOOD
                            T9020(optasm)   -1.1%
                   hard_hole_fits(normal)  -37.0% GOOD
      
                                geo. mean   -1.3%
                                minimum    -40.7%
                                maximum     +0.5%
      
      Metric Decrease:
          T12227
          T15703
          T17836
          T17836b
          T8095
          hard_hole_fits
          LargeRecord
          T9198
          T13035
      e1590ddc
  7. May 19, 2023
    • Simon Peyton Jones's avatar
      Type inference for data family newtype instances · 525ed554
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      This patch addresses #23408, a tricky case with data family
      newtype instances.  Consider
      
        type family TF a where TF Char = Bool
        data family DF a
        newtype instance DF Bool = MkDF Int
      
      and [W] Int ~R# DF (TF a), with a Given (a ~# Char).   We must fully
      rewrite the Wanted so the tpye family can fire; that wasn't happening.
      525ed554
    • Oleg Grenrus's avatar
      Make Warn = Located DriverMessage · 4bca0486
      Oleg Grenrus authored
      This change makes command line argument parsing use diagnostic
      framework for producing warnings.
      4bca0486
  8. May 18, 2023
    • Simon Peyton Jones's avatar
      Allow the demand analyser to unpack tuple and equality dictionaries · 7ae45459
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      Addresses #23398. The demand analyser usually does not unpack class
      dictionaries: see Note [Do not unbox class dictionaries] in
      GHC.Core.Opt.DmdAnal.
      
      This patch makes an exception for tuple dictionaries and equality
      dictionaries, for reasons explained in wrinkles (DNB1) and (DNB2) of
      the above Note.
      
      Compile times fall by 0.1% for some reason (max 0.7% on T18698b).
      7ae45459
  9. May 15, 2023
    • sheaf's avatar
      Migrate errors to diagnostics in GHC.Tc.Module · 4d29ecdf
      sheaf authored and Marge Bot's avatar Marge Bot committed
      This commit migrates the errors in GHC.Tc.Module to use the new
      diagnostic infrastructure.
      
      It required a significant overhaul of the compatibility checks between
      an hs-boot or signature module and its implementation; we now use
      a Writer monad to accumulate errors; see the BootMismatch datatype
      in GHC.Tc.Errors.Types, with its panoply of subtypes.
      For the sake of readability, several local functions inside the
      'checkBootTyCon' function were split off into top-level functions.
      
      We split off GHC.Types.HscSource into a "boot or sig" vs "normal hs file"
      datatype, as this mirrors the logic in several other places where we
      want to treat hs-boot and hsig files in a similar fashion.
      
      This commit also refactors the Backpack checks for type synonyms
      implementing abstract data, to correctly reject implementations that
      contain qualified or quantified types (this fixes #23342 and #23344).
      4d29ecdf
  10. May 13, 2023
    • Simon Peyton Jones's avatar
      Use the eager unifier in the constraint solver · 8b9b7dbc
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      This patch continues the refactoring of the constraint solver
      described in #23070.
      
      The Big Deal in this patch is to call the regular, eager unifier from the
      constraint solver, when we want to create new equalities. This
      replaces the existing, unifyWanted which amounted to
      yet-another-unifier, so it reduces duplication of a rather subtle
      piece of technology. See
      
        * Note [The eager unifier] in GHC.Tc.Utils.Unify
        * GHC.Tc.Solver.Monad.wrapUnifierTcS
      
      I did lots of other refactoring along the way
      
      * I simplified the treatment of right hand sides that contain CoercionHoles.
        Now, a constraint that contains a hetero-kind CoercionHole is non-canonical,
        and cannot be used for rewriting or unification alike.  This required me
        to add the ch_hertero_kind flag to CoercionHole, with consequent knock-on
        effects. See wrinkle (2) of `Note [Equalities with incompatible kinds]` in
        GHC.Tc.Solver.Equality.
      
      * I refactored the StopOrContinue type to add StartAgain, so that after a
        fundep improvement (for example) we can simply start the pipeline again.
      
      * I got rid of the unpleasant (and inefficient) rewriterSetFromType/Co functions.
        With Richard I concluded that they are never needed.
      
      * I discovered Wrinkle (W1) in Note [Wanteds rewrite Wanteds] in
        GHC.Tc.Types.Constraint, and therefore now prioritise non-rewritten equalities.
      
      Quite a few error messages change, I think always for the better.
      
      Compiler runtime stays about the same, with one outlier: a 17% improvement in T17836
      
      Metric Decrease:
          T17836
          T18223
      8b9b7dbc
  11. May 05, 2023
  12. Apr 14, 2023
    • Simon Peyton Jones's avatar
      Major refactor in the handling of equality constraints · 2371d6b2
      Simon Peyton Jones authored and Krzysztof Gogolewski's avatar Krzysztof Gogolewski committed
      This MR substantially refactors the way in which the constraint
      solver deals with equality constraints.  The big thing is:
      
      * Intead of a pipeline in which we /first/ canonicalise and /then/
        interact (the latter including performing unification) the two steps
        are more closely integreated into one.  That avoids the current
        rather indirect communication between the two steps.
      
      The proximate cause for this refactoring is fixing #22194, which involve
      solving   [W] alpha[2] ~ Maybe (F beta[4])
      by doing this:
                alpha[2] := Maybe delta[2]
                [W] delta[2] ~ F beta[4]
      That is, we don't promote beta[4]!  This is very like introducing a cycle
      breaker, and was very awkward to do before, but now it is all nice.
      See GHC.Tc.Utils.Unify Note [Promotion and level-checking] and
      Note [Family applications in canonical constraints].
      
      The big change is this:
      
      * Several canonicalisation checks (occurs-check, cycle-breaking,
        checking for concreteness) are combined into one new function:
           GHC.Tc.Utils.Unify.checkTyEqRhs
      
        This function is controlled by `TyEqFlags`, which says what to do
        for foralls, type families etc.
      
      * `canEqCanLHSFinish` now sees if unification is possible, and if so,
        actually does it: see `canEqCanLHSFinish_try_unification`.
      
      There are loads of smaller changes:
      
      * The on-the-fly unifier `GHC.Tc.Utils.Unify.unifyType` has a
        cheap-and-cheerful version of `checkTyEqRhs`, called
        `simpleUnifyCheck`.  If `simpleUnifyCheck` succeeds, it can unify,
        otherwise it defers by emitting a constraint. This is simpler than
        before.
      
      * I simplified the swapping code in `GHC.Tc.Solver.Equality.canEqCanLHS`.
        Especially the nasty stuff involving `swap_for_occurs` and
        `canEqTyVarFunEq`.  Much nicer now.  See
            Note [Orienting TyVarLHS/TyFamLHS]
            Note [Orienting TyFamLHS/TyFamLHS]
      
      * Added `cteSkolemOccurs`, `cteConcrete`, and `cteCoercionHole` to the
        problems that can be discovered by `checkTyEqRhs`.
      
      * I fixed #23199 `pickQuantifiablePreds`, which actually allows GHC to
        to accept both cases in #22194 rather than rejecting both.
      
      Yet smaller:
      
      * Added a `synIsConcrete` flag to `SynonymTyCon` (alongside `synIsFamFree`)
        to reduce the need for synonym expansion when checking concreteness.
        Use it in `isConcreteType`.
      
      * Renamed `isConcrete` to `isConcreteType`
      
      * Defined `GHC.Core.TyCo.FVs.isInjectiveInType` as a more efficient
        way to find if a particular type variable is used injectively than
        finding all the injective variables.  It is called in
        `GHC.Tc.Utils.Unify.definitely_poly`, which in turn is used quite a
        lot.
      
      * Moved `rewriterView` to `GHC.Core.Type`, so we can use it from the
        constraint solver.
      
      Fixes #22194, #23199
      
      Compile times decrease by an average of 0.1%; but there is a 7.4%
      drop in compiler allocation on T15703.
      
      Metric Decrease:
          T15703
      2371d6b2
  13. Apr 01, 2023
  14. Mar 06, 2023
    • Andrei Borzenkov's avatar
      Convert diagnostics in GHC.Rename.Module to proper TcRnMessage (#20115) · cad5c576
      Andrei Borzenkov authored and Marge Bot's avatar Marge Bot committed
      I've turned almost all occurrences of TcRnUnknownMessage in GHC.Rename.Module
      module into a proper TcRnMessage.
      Instead, these TcRnMessage messages were introduced:
        TcRnIllegalInstanceHeadDecl
        TcRnUnexpectedStandaloneDerivingDecl
        TcRnUnusedVariableInRuleDecl
        TcRnUnexpectedStandaloneKindSig
        TcRnIllegalRuleLhs
        TcRnBadAssocRhs
        TcRnDuplicateRoleAnnot
        TcRnDuplicateKindSig
        TcRnIllegalDerivStrategy
        TcRnIllegalMultipleDerivClauses
        TcRnNoDerivStratSpecified
        TcRnStupidThetaInGadt
        TcRnBadImplicitSplice
        TcRnShadowedTyVarNameInFamResult
        TcRnIncorrectTyVarOnLhsOfInjCond
        TcRnUnknownTyVarsOnRhsOfInjCond
      
      Was introduced one helper type:
        RuleLhsErrReason
      cad5c576
  15. Jan 28, 2023
    • Simon Peyton Jones's avatar
      Report family instance orphans correctly · 46a53bb2
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      This fixes the fact that we were not reporting orphan family instances
      at all. The fix here is easy, but touches a bit of code. I refactored
      the code to be much more similar to the way that class instances are done:
      
         - Add a fi_orphan field to FamInst, like the is_orphan field in ClsInst
         - Make newFamInst initialise this field, just like newClsInst
         - And make newFamInst report a warning for an orphan, just like newClsInst
         - I moved newFamInst from GHC.Tc.Instance.Family to GHC.Tc.Utils.Instantiate,
           just like newClsInst.
         - I added mkLocalFamInst to FamInstEnv, just like mkLocalClsInst in InstEnv
         - TcRnOrphanInstance and SuggestFixOrphanInstance are now parametrised
           over class instances vs type/data family instances.
      
      Fixes #19773
      46a53bb2
    • Simon Peyton Jones's avatar
      Detect family instance orphans correctly · 638277ba
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      We were treating a type-family instance as a non-orphan if there
      was a type constructor on its /right-hand side/ that was local. Boo!
      Utterly wrong. With this patch, we correctly check the /left-hand side/
      instead!
      
      Fixes #22717
      638277ba
  16. Jan 11, 2023
    • Richard Eisenberg's avatar
      Refactor the treatment of loopy superclass dicts · aed1974e
      Richard Eisenberg authored and Simon Peyton Jones's avatar Simon Peyton Jones committed
      This patch completely re-engineers how we deal with loopy superclass
      dictionaries in instance declarations. It fixes #20666 and #19690
      
      The highlights are
      
      * Recognise that the loopy-superclass business should use precisely
        the Paterson conditions.  This is much much nicer.  See
        Note [Recursive superclasses] in GHC.Tc.TyCl.Instance
      
      * With that in mind, define "Paterson-smaller" in
        Note [Paterson conditions] in GHC.Tc.Validity, and the new
        data type `PatersonSize` in GHC.Tc.Utils.TcType, along with
        functions to compute and compare PatsonSizes
      
      * Use the new PatersonSize stuff when solving superclass constraints
        See Note [Solving superclass constraints] in GHC.Tc.TyCl.Instance
      
      * In GHC.Tc.Solver.Monad.lookupInInerts, add a missing call to
        prohibitedSuperClassSolve.  This was the original cause of #20666.
      
      * Treat (TypeError "stuff") as having PatersonSize zero. See
        Note [Paterson size for type family applications] in GHC.Tc.Utils.TcType.
      
      * Treat the head of a Wanted quantified constraint in the same way
        as the superclass of an instance decl; this is what fixes #19690.
        See GHC.Tc.Solver.Canonical Note [Solving a Wanted forall-constraint]
        (Thanks to Matthew Craven for this insight.)
      
        This entailed refactoring the GivenSc constructor of CtOrigin a bit,
        to say whether it comes from an instance decl or quantified constraint.
      
      * Some refactoring way in which redundant constraints are reported; we
        don't want to complain about the extra, apparently-redundant
        constraints that we must add to an instance decl because of the
        loopy-superclass thing.  I moved some work from GHC.Tc.Errors to
        GHC.Tc.Solver.
      
      * Add a new section to the user manual to describe the loopy
        superclass issue and what rules it follows.
      aed1974e
  17. Dec 15, 2022
    • Simon Peyton Jones's avatar
      Fix bogus test in Lint · 933d61a4
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      The Lint check for branch compatiblity within an axiom, in
      GHC.Core.Lint.compatible_branches was subtly different to the
      check made when contructing an axiom, in
      GHC.Core.FamInstEnv.compatibleBranches.
      
      The latter is correct, so I killed the former and am now using the
      latter.
      
      On the way I did some improvements to pretty-printing and documentation.
      933d61a4
  18. Nov 29, 2022
    • Sylvain Henry's avatar
      Add Javascript backend · cc25d52e
      Sylvain Henry authored
      
      Add JS backend adapted from the GHCJS project by Luite Stegeman.
      
      Some features haven't been ported or implemented yet. Tests for these
      features have been disabled with an associated gitlab ticket.
      
      Bump array submodule
      
      Work funded by IOG.
      
      Co-authored-by: default avatarJeffrey Young <jeffrey.young@iohk.io>
      Co-authored-by: default avatarLuite Stegeman <stegeman@gmail.com>
      Co-authored-by: default avatarJosh Meredith <joshmeredith2008@gmail.com>
      cc25d52e
    • Apoorv Ingle's avatar
      Killing cc_fundeps, streamlining kind equality orientation, and type equality processing order · 8d15eadc
      Apoorv Ingle authored and Marge Bot's avatar Marge Bot committed
      Fixes: #217093
      Associated to #19415
      
      This change
      * Flips the orientation of the the generated kind equality coercion in canEqLHSHetero;
      * Removes `cc_fundeps` in CDictCan as the check was incomplete;
      * Changes `canDecomposableTyConAppOk` to ensure we process kind equalities before type equalities and avoiding a call to `canEqLHSHetero` while processing wanted TyConApp equalities
      * Adds 2 new tests for validating the change
         - testsuites/typecheck/should_compile/T21703.hs and
         - testsuites/typecheck/should_fail/T19415b.hs (a simpler version of T19415.hs)
      * Misc: Due to the change in the equality direction some error messages now have flipped type mismatch errors
      * Changes in Notes:
        - Note [Fundeps with instances, and equality orientation] supercedes Note [Fundeps with instances]
        - Added Note [Kind Equality Orientation] to visualize the kind flipping
        - Added Note [Decomposing Dependent TyCons and Processing Wanted Equalties]
      8d15eadc
  19. Nov 25, 2022
    • Vladislav Zavialov's avatar
      Print unticked promoted data constructors (#20531) · 13d627bb
      Vladislav Zavialov authored and Marge Bot's avatar Marge Bot committed
      
      Before this patch, GHC unconditionally printed ticks before promoted
      data constructors:
      
      	ghci> type T = True  -- unticked (user-written)
      	ghci> :kind! T
      	T :: Bool
      	= 'True              -- ticked (compiler output)
      
      After this patch, GHC prints ticks only when necessary:
      
      	ghci> type F = False    -- unticked (user-written)
      	ghci> :kind! F
      	F :: Bool
      	= False                 -- unticked (compiler output)
      
      	ghci> data False        -- introduce ambiguity
      	ghci> :kind! F
      	F :: Bool
      	= 'False                -- ticked by necessity (compiler output)
      
      The old behavior can be enabled by -fprint-redundant-promotion-ticks.
      
      Summary of changes:
      * Rename PrintUnqualified to NamePprCtx
      * Add QueryPromotionTick to it
      * Consult the GlobalRdrEnv to decide whether to print a tick (see mkPromTick)
      * Introduce -fprint-redundant-promotion-ticks
      
      Co-authored-by: default avatarArtyom Kuznetsov <hi@wzrd.ht>
      13d627bb
  20. Nov 11, 2022
    • Simon Peyton Jones's avatar
      Type vs Constraint: finally nailed · 778c6adc
      Simon Peyton Jones authored and Simon Peyton Jones's avatar Simon Peyton Jones committed
      This big patch addresses the rats-nest of issues that have plagued
      us for years, about the relationship between Type and Constraint.
      See #11715/#21623.
      
      The main payload of the patch is:
      * To introduce CONSTRAINT :: RuntimeRep -> Type
      * To make TYPE and CONSTRAINT distinct throughout the compiler
      
      Two overview Notes in GHC.Builtin.Types.Prim
      
      * Note [TYPE and CONSTRAINT]
      
      * Note [Type and Constraint are not apart]
        This is the main complication.
      
      The specifics
      
      * New primitive types (GHC.Builtin.Types.Prim)
        - CONSTRAINT
        - ctArrowTyCon (=>)
        - tcArrowTyCon (-=>)
        - ccArrowTyCon (==>)
        - funTyCon     FUN     -- Not new
        See Note [Function type constructors and FunTy]
        and Note [TYPE and CONSTRAINT]
      
      * GHC.Builtin.Types:
        - New type Constraint = CONSTRAINT LiftedRep
        - I also stopped nonEmptyTyCon being built-in; it only needs to be wired-in
      
      * Exploit the fact that Type and Constraint are distinct throughout GHC
        - Get rid of tcView in favour of coreView.
        - Many tcXX functions become XX functions.
          e.g. tcGetCastedTyVar --> getCastedTyVar
      
      * Kill off Note [ForAllTy and typechecker equality], in (old)
        GHC.Tc.Solver.Canonical.  It said that typechecker-equality should ignore
        the specified/inferred distinction when comparein two ForAllTys.  But
        that wsa only weakly supported and (worse) implies that we need a separate
        typechecker equality, different from core equality. No no no.
      
      * GHC.Core.TyCon: kill off FunTyCon in data TyCon.  There was no need for it,
        and anyway now we have four of them!
      
      * GHC.Core.TyCo.Rep: add two FunTyFlags to FunCo
        See Note [FunCo] in that module.
      
      * GHC.Core.Type.  Lots and lots of changes driven by adding CONSTRAINT.
        The key new function is sORTKind_maybe; most other changes are built
        on top of that.
      
        See also `funTyConAppTy_maybe` and `tyConAppFun_maybe`.
      
      * Fix a longstanding bug in GHC.Core.Type.typeKind, and Core Lint, in
        kinding ForAllTys.  See new tules (FORALL1) and (FORALL2) in GHC.Core.Type.
        (The bug was that before (forall (cv::t1 ~# t2). blah), where
        blah::TYPE IntRep, would get kind (TYPE IntRep), but it should be
        (TYPE LiftedRep).  See Note [Kinding rules for types] in GHC.Core.Type.
      
      * GHC.Core.TyCo.Compare is a new module in which we do eqType and cmpType.
        Of course, no tcEqType any more.
      
      * GHC.Core.TyCo.FVs. I moved some free-var-like function into this module:
        tyConsOfType, visVarsOfType, and occCheckExpand.  Refactoring only.
      
      * GHC.Builtin.Types.  Compiletely re-engineer boxingDataCon_maybe to
        have one for each /RuntimeRep/, rather than one for each /Type/.
        This dramatically widens the range of types we can auto-box.
        See Note [Boxing constructors] in GHC.Builtin.Types
        The boxing types themselves are declared in library ghc-prim:GHC.Types.
      
        GHC.Core.Make.  Re-engineer the treatment of "big" tuples (mkBigCoreVarTup
        etc) GHC.Core.Make, so that it auto-boxes unboxed values and (crucially)
        types of kind Constraint. That allows the desugaring for arrows to work;
        it gathers up free variables (including dictionaries) into tuples.
        See  Note [Big tuples] in GHC.Core.Make.
      
        There is still work to do here: #22336. But things are better than
        before.
      
      * GHC.Core.Make.  We need two absent-error Ids, aBSENT_ERROR_ID for types of
        kind Type, and aBSENT_CONSTRAINT_ERROR_ID for vaues of kind Constraint.
        Ditto noInlineId vs noInlieConstraintId in GHC.Types.Id.Make;
        see Note [inlineId magic].
      
      * GHC.Core.TyCo.Rep. Completely refactor the NthCo coercion.  It is now called
        SelCo, and its fields are much more descriptive than the single Int we used to
        have.  A great improvement.  See Note [SelCo] in GHC.Core.TyCo.Rep.
      
      * GHC.Core.RoughMap.roughMatchTyConName.  Collapse TYPE and CONSTRAINT to
        a single TyCon, so that the rough-map does not distinguish them.
      
      * GHC.Core.DataCon
        - Mainly just improve documentation
      
      * Some significant renamings:
        GHC.Core.Multiplicity: Many -->  ManyTy (easier to grep for)
                               One  -->  OneTy
        GHC.Core.TyCo.Rep TyCoBinder      -->   GHC.Core.Var.PiTyBinder
        GHC.Core.Var      TyCoVarBinder   -->   ForAllTyBinder
                          AnonArgFlag     -->   FunTyFlag
                          ArgFlag         -->   ForAllTyFlag
        GHC.Core.TyCon    TyConTyCoBinder --> TyConPiTyBinder
        Many functions are renamed in consequence
        e.g. isinvisibleArgFlag becomes isInvisibleForAllTyFlag, etc
      
      * I refactored FunTyFlag (was AnonArgFlag) into a simple, flat data type
          data FunTyFlag
            = FTF_T_T           -- (->)  Type -> Type
            | FTF_T_C           -- (-=>) Type -> Constraint
            | FTF_C_T           -- (=>)  Constraint -> Type
            | FTF_C_C           -- (==>) Constraint -> Constraint
      
      * GHC.Tc.Errors.Ppr.  Some significant refactoring in the TypeEqMisMatch case
        of pprMismatchMsg.
      
      * I made the tyConUnique field of TyCon strict, because I
        saw code with lots of silly eval's.  That revealed that
        GHC.Settings.Constants.mAX_SUM_SIZE can only be 63, because
        we pack the sum tag into a 6-bit field.  (Lurking bug squashed.)
      
      Fixes
      * #21530
      
      Updates haddock submodule slightly.
      
      Performance changes
      ~~~~~~~~~~~~~~~~~~~
      I was worried that compile times would get worse, but after
      some careful profiling we are down to a geometric mean 0.1%
      increase in allocation (in perf/compiler).  That seems fine.
      
      There is a big runtime improvement in T10359
      
      Metric Decrease:
          LargeRecord
          MultiLayerModulesTH_OneShot
          T13386
          T13719
      Metric Increase:
          T8095
      778c6adc
  21. Nov 09, 2022
    • Giles Anderson's avatar
      Use TcRnDiagnostic in GHC.Tc.TyCl.Instance (#20117) · 92ccb8de
      Giles Anderson authored and Marge Bot's avatar Marge Bot committed
      The following `TcRnDiagnostic` messages have been introduced:
      
      TcRnWarnUnsatisfiedMinimalDefinition
      TcRnMisplacedInstSig
      TcRnBadBootFamInstDeclErr
      TcRnIllegalFamilyInstance
      TcRnAssocInClassErr
      TcRnBadFamInstDecl
      TcRnNotOpenFamily
      92ccb8de
  22. Nov 01, 2022
    • Simon Peyton Jones's avatar
      Add accurate skolem info when quantifying · 0560821f
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      Ticket #22379 revealed that skolemiseQuantifiedTyVar was
      dropping the passed-in skol_info on the floor when it encountered
      a SkolemTv.  Bad!  Several TyCons thereby share a single SkolemInfo
      on their binders, which lead to bogus error reports.
      0560821f
  23. Oct 26, 2022
  24. Oct 13, 2022
  25. Sep 28, 2022
    • Simon Peyton Jones's avatar
      Improve aggressive specialisation · 2a53ac18
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      This patch fixes #21286, by not unboxing dictionaries in
      worker/wrapper (ever). The main payload is tiny:
      
      * In `GHC.Core.Opt.DmdAnal.finaliseArgBoxities`, do not unbox
        dictionaries in `get_dmd`.  See Note [Do not unbox class dictionaries]
        in that module
      
      * I also found that imported wrappers were being fruitlessly
        specialised, so I fixed that too, in canSpecImport.
        See Note [Specialising imported functions] point (2).
      
      In doing due diligence in the testsuite I fixed a number of
      other things:
      
      * Improve Note [Specialising unfoldings] in GHC.Core.Unfold.Make,
        and Note [Inline specialisations] in GHC.Core.Opt.Specialise,
        and remove duplication between the two. The new Note describes
        how we specialise functions with an INLINABLE pragma.
      
        And simplify the defn of `spec_unf` in `GHC.Core.Opt.Specialise.specCalls`.
      
      * Improve Note [Worker/wrapper for INLINABLE functions] in
        GHC.Core.Opt.WorkWrap.
      
        And (critially) make an actual change which is to propagate the
        user-written pragma from the original function to the wrapper; see
        `mkStrWrapperInlinePrag`.
      
      * Write new Note [Specialising imported functions] in
        GHC.Core.Opt.Specialise
      
      All this has a big effect on some compile times. This is
      compiler/perf, showing only changes over 1%:
      
      Metrics: compile_time/bytes allocated
      -------------------------------------
                      LargeRecord(normal)  -50.2% GOOD
                 ManyConstructors(normal)   +1.0%
      MultiLayerModulesTH_OneShot(normal)   +2.6%
                        PmSeriesG(normal)   -1.1%
                           T10547(normal)   -1.2%
                           T11195(normal)   -1.2%
                           T11276(normal)   -1.0%
                          T11303b(normal)   -1.6%
                           T11545(normal)   -1.4%
                           T11822(normal)   -1.3%
                           T12150(optasm)   -1.0%
                           T12234(optasm)   -1.2%
                           T13056(optasm)   -9.3% GOOD
                           T13253(normal)   -3.8% GOOD
                           T15164(normal)   -3.6% GOOD
                           T16190(normal)   -2.1%
                           T16577(normal)   -2.8% GOOD
                           T16875(normal)   -1.6%
                           T17836(normal)   +2.2%
                          T17977b(normal)   -1.0%
                           T18223(normal)  -33.3% GOOD
                           T18282(normal)   -3.4% GOOD
                           T18304(normal)   -1.4%
                          T18698a(normal)   -1.4% GOOD
                          T18698b(normal)   -1.3% GOOD
                           T19695(normal)   -2.5% GOOD
                            T5837(normal)   -2.3%
                            T9630(normal)  -33.0% GOOD
                            WWRec(normal)   -9.7% GOOD
                   hard_hole_fits(normal)   -2.1% GOOD
                           hie002(normal)   +1.6%
      
                                geo. mean   -2.2%
                                minimum    -50.2%
                                maximum     +2.6%
      
      I diligently investigated some of the big drops.
      
      * Caused by not doing w/w for dictionaries:
          T13056, T15164, WWRec, T18223
      
      * Caused by not fruitlessly specialising wrappers
          LargeRecord, T9630
      
      For runtimes, here is perf/should+_run:
      
      Metrics: runtime/bytes allocated
      --------------------------------
                     T12990(normal)   -3.8%
                      T5205(normal)   -1.3%
                      T9203(normal)  -10.7% GOOD
              haddock.Cabal(normal)   +0.1%
               haddock.base(normal)   -1.1%
           haddock.compiler(normal)   -0.3%
              lazy-bs-alloc(normal)   -0.2%
      ------------------------------------------
                          geo. mean   -0.3%
                          minimum    -10.7%
                          maximum     +0.1%
      
      I did not investigate exactly what happens in T9203.
      
      Nofib is a wash:
      
      +-------------------------------++--+-----------+-----------+
      |                               ||  | tsv (rel) | std. err. |
      +===============================++==+===========+===========+
      |                     real/anna ||  |    -0.13% |      0.0% |
      |                      real/fem ||  |    +0.13% |      0.0% |
      |                   real/fulsom ||  |    -0.16% |      0.0% |
      |                     real/lift ||  |    -1.55% |      0.0% |
      |                  real/reptile ||  |    -0.11% |      0.0% |
      |                  real/smallpt ||  |    +0.51% |      0.0% |
      |          spectral/constraints ||  |    +0.20% |      0.0% |
      |               spectral/dom-lt ||  |    +1.80% |      0.0% |
      |               spectral/expert ||  |    +0.33% |      0.0% |
      +===============================++==+===========+===========+
      |                     geom mean ||  |           |           |
      +-------------------------------++--+-----------+-----------+
      
      I spent quite some time investigating dom-lt, but it's pretty
      complicated.  See my note on !7847.  Conclusion: it's just a delicate
      inlining interaction, and we have plenty of those.
      
      Metric Decrease:
          LargeRecord
          T13056
          T13253
          T15164
          T16577
          T18223
          T18282
          T18698a
          T18698b
          T19695
          T9630
          WWRec
          hard_hole_fits
          T9203
      2a53ac18
  26. Sep 13, 2022
    • sheaf's avatar
      Diagnostic codes: acccept test changes · 362cca13
      sheaf authored and Marge Bot's avatar Marge Bot committed
      The testsuite output now contains diagnostic codes, so many tests need
      to be updated at once.
      We decided it was best to keep the diagnostic codes in the testsuite
      output, so that contributors don't inadvertently make changes to the
      diagnostic codes.
      362cca13
  27. Aug 19, 2022
  28. Jul 28, 2022
  29. Jul 25, 2022
    • Simon Peyton Jones's avatar
      Get the in-scope set right in FamInstEnv.injectiveBranches · 61faff40
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      There was an assert error, as Gergo pointed out in #21896.
      
      I fixed this by adding an InScopeSet argument to tcUnifyTyWithTFs.
      And also to GHC.Core.Unify.niFixTCvSubst.
      
      I also took the opportunity to get a couple more InScopeSets right,
      and to change some substTyUnchecked into substTy.
      
      This MR touches a lot of other files, but only because I also took the
      opportunity to introduce mkInScopeSetList, and use it.
      61faff40
    • Simon Peyton Jones's avatar
      Implement DeepSubsumption · dc27e15a
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      This MR adds the language extension -XDeepSubsumption, implementing
      GHC proposal #511.  This change mitigates the impact of GHC proposal
      
      The changes are highly localised, by design.  See Note [Deep subsumption]
      in GHC.Tc.Utils.Unify.
      
      The main changes are:
      
      * Add -XDeepSubsumption, which is on by default in Haskell98 and Haskell2010,
        but off in Haskell2021.
      
        -XDeepSubsumption largely restores the behaviour before the "simple subsumption" change.
        -XDeepSubsumpition has a similar flavour as -XNoMonoLocalBinds:
        it makes type inference more complicated and less predictable, but it
        may be convenient in practice.
      
      * The main changes are in:
        * GHC.Tc.Utils.Unify.tcSubType, which does deep susumption and eta-expanansion
        * GHC.Tc.Utils.Unify.tcSkolemiseET, which does deep skolemisation
        * In GHC.Tc.Gen.App.tcApp we call tcSubTypeNC to match the result
          type. Without deep subsumption, unifyExpectedType would be sufficent.
      
        See Note [Deep subsumption] in GHC.Tc.Utils.Unify.
      
      * There are no changes to Quick Look at all.
      
      * The type of `withDict` becomes ambiguous; so add -XAllowAmbiguousTypes to
        GHC.Magic.Dict
      
      * I fixed a small but egregious bug in GHC.Core.FVs.varTypeTyCoFVs, where
        we'd forgotten to take the free vars of the multiplicity of an Id.
      
      * I also had to fix tcSplitNestedSigmaTys
      
        When I did the shallow-subsumption patch
          commit 2b792fac
          Date:   Sun Feb 2 18:23:11 2020 +0000
          Simple subsumption
      
        I changed tcSplitNestedSigmaTys to not look through function arrows
        any more.  But that was actually an un-forced change.  This function
        is used only in
      
        * Improving error messages in GHC.Tc.Gen.Head.addFunResCtxt
        * Validity checking for default methods: GHC.Tc.TyCl.checkValidClass
        * A couple of calls in the GHCi debugger: GHC.Runtime.Heap.Inspect
      
        All to do with validity checking and error messages. Acutally its
        fine to look under function arrows here, and quite useful a test
        DeepSubsumption05 (a test motivated by a build failure in the
        `lens` package) shows.
      
        The fix is easy.  I added Note [tcSplitNestedSigmaTys].
      dc27e15a
  30. Jun 27, 2022
  31. Jun 06, 2022
  32. May 27, 2022
    • Richard Eisenberg's avatar
      Generalize breakTyVarCycle to work with TyFamLHS · d87530bb
      Richard Eisenberg authored and Marge Bot's avatar Marge Bot committed
      The function breakTyVarCycle_maybe has been installed
      in a dark corner of GHC to catch some gremlins (a.k.a.
      occurs-check failures) who lurk
      there. But it previously only caught gremlins of the
      form (a ~ ... F a ...), where some of our intrepid users
      have spawned gremlins of the form (G a ~ ... F (G a) ...).
      This commit improves breakTyVarCycle_maybe (and renames
      it to breakTyEqCycle_maybe) to catch the new gremlins.
      
      Happily, the change is remarkably small.
      
      The gory details are in Note [Type equality cycles].
      
      Test cases: typecheck/should_compile/{T21515,T21473}.
      d87530bb
  33. Apr 01, 2022
Loading