Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
-
62899117
by Florian Ragwitz at 2025-08-13T21:01:34-04:00
-
b37b3af7
by Florian Ragwitz at 2025-08-13T21:01:34-04:00
6 changed files:
- compiler/GHC/HsToCore/Ticks.hs
- − docs/users_guide/9.14.1-notes.rst
- + docs/users_guide/9.16.1-notes.rst
- docs/users_guide/release-notes.rst
- testsuite/tests/hpc/recsel/recsel.hs
- testsuite/tests/hpc/recsel/recsel.stdout
Changes:
| ... | ... | @@ -251,7 +251,7 @@ addTickLHsBind (L pos (XHsBindsLR bind@(AbsBinds { abs_binds = binds |
| 251 | 251 | |
| 252 | 252 | add_rec_sels env =
|
| 253 | 253 | env{ recSelBinds = recSelBinds env `extendVarEnvList`
|
| 254 | - [ (abe_mono, abe_poly)
|
|
| 254 | + [ (abe_mono, unitDVarSet abe_poly)
|
|
| 255 | 255 | | ABE{ abe_poly, abe_mono } <- abs_exports
|
| 256 | 256 | , RecSelId{} <- [idDetails abe_poly] ] }
|
| 257 | 257 | |
| ... | ... | @@ -270,8 +270,8 @@ addTickLHsBind (L pos (funBind@(FunBind { fun_id = L _ id, fun_matches = matches |
| 270 | 270 | case tickish of { ProfNotes | inline -> return (L pos funBind); _ -> do
|
| 271 | 271 | |
| 272 | 272 | -- See Note [Record-selector ticks]
|
| 273 | - selTick <- recSelTick id
|
|
| 274 | - case selTick of { Just tick -> tick_rec_sel tick; _ -> do
|
|
| 273 | + selTicks <- recSelTick id
|
|
| 274 | + case selTicks of { Just ticks -> tick_rec_sel ticks; _ -> do
|
|
| 275 | 275 | |
| 276 | 276 | (fvs, mg) <-
|
| 277 | 277 | getFreeVars $
|
| ... | ... | @@ -303,8 +303,8 @@ addTickLHsBind (L pos (funBind@(FunBind { fun_id = L _ id, fun_matches = matches |
| 303 | 303 | } }
|
| 304 | 304 | where
|
| 305 | 305 | -- See Note [Record-selector ticks]
|
| 306 | - tick_rec_sel tick =
|
|
| 307 | - pure $ L pos $ funBind { fun_ext = second (tick :) (fun_ext funBind) }
|
|
| 306 | + tick_rec_sel ticks =
|
|
| 307 | + pure $ L pos $ funBind { fun_ext = second (ticks ++) (fun_ext funBind) }
|
|
| 308 | 308 | |
| 309 | 309 | |
| 310 | 310 | -- Note [Record-selector ticks]
|
| ... | ... | @@ -319,9 +319,8 @@ addTickLHsBind (L pos (funBind@(FunBind { fun_id = L _ id, fun_matches = matches |
| 319 | 319 | -- coverage purposes to improve the developer experience.
|
| 320 | 320 | --
|
| 321 | 321 | -- This is done by keeping track of which 'Id's are effectively bound to
|
| 322 | --- record fields (using NamedFieldPuns or RecordWildCards) in 'TickTransEnv's
|
|
| 323 | --- 'recSelBinds', and making 'HsVar's corresponding to those fields tick the
|
|
| 324 | --- appropriate box when executed.
|
|
| 322 | +-- record fields in 'TickTransEnv's 'recSelBinds', and making 'HsVar's
|
|
| 323 | +-- corresponding to those fields tick the appropriate box when executed.
|
|
| 325 | 324 | --
|
| 326 | 325 | -- To enable that, we also treat 'FunBind's for record selector functions
|
| 327 | 326 | -- specially. We only create a TopLevelBox for the record selector function,
|
| ... | ... | @@ -329,11 +328,11 @@ addTickLHsBind (L pos (funBind@(FunBind { fun_id = L _ id, fun_matches = matches |
| 329 | 328 | -- of ticks for the same record selector, and is done by not recursing into
|
| 330 | 329 | -- the fun_matches match group for record selector functions.
|
| 331 | 330 | --
|
| 331 | +-- Note that due to the use of 'HsVar's for ticking, certain patterns such
|
|
| 332 | +-- as `Foo{foo = 42}` will not cause the `foo` selector to be ticked.
|
|
| 333 | +--
|
|
| 332 | 334 | -- This scheme could be extended further in the future, making coverage for
|
| 333 | --- constructor fields (named or even positional) mean that the field was
|
|
| 334 | --- accessed at run-time. For the time being, we only cover NamedFieldPuns and
|
|
| 335 | --- RecordWildCards binds to cover most practical use-cases while keeping it
|
|
| 336 | --- simple.
|
|
| 335 | +-- positional constructor fields mean that the field was accessed at run-time.
|
|
| 337 | 336 | |
| 338 | 337 | -- TODO: Revisit this
|
| 339 | 338 | addTickLHsBind (L pos (pat@(PatBind { pat_lhs = lhs
|
| ... | ... | @@ -519,7 +518,7 @@ addTickHsExpr :: HsExpr GhcTc -> TM (HsExpr GhcTc) |
| 519 | 518 | -- See Note [Record-selector ticks]
|
| 520 | 519 | addTickHsExpr e@(HsVar _ (L _ id)) =
|
| 521 | 520 | freeVar id >> recSelTick id >>= pure . maybe e wrap
|
| 522 | - where wrap tick = XExpr . HsTick tick . noLocA $ e
|
|
| 521 | + where wrap = foldr (\tick -> XExpr . HsTick tick . noLocA) e
|
|
| 523 | 522 | addTickHsExpr e@(HsIPVar {}) = return e
|
| 524 | 523 | addTickHsExpr e@(HsOverLit {}) = return e
|
| 525 | 524 | addTickHsExpr e@(HsOverLabel{}) = return e
|
| ... | ... | @@ -1086,7 +1085,7 @@ data TickTransEnv = TTE { fileName :: FastString |
| 1086 | 1085 | , blackList :: Set RealSrcSpan
|
| 1087 | 1086 | , this_mod :: Module
|
| 1088 | 1087 | , tickishType :: TickishType
|
| 1089 | - , recSelBinds :: IdEnv Id
|
|
| 1088 | + , recSelBinds :: IdEnv DVarSet
|
|
| 1090 | 1089 | }
|
| 1091 | 1090 | |
| 1092 | 1091 | -- deriving Show
|
| ... | ... | @@ -1241,11 +1240,12 @@ allocTickBox boxLabel countEntries topOnly pos m |
| 1241 | 1240 | tickish <- mkTickish boxLabel countEntries topOnly pos fvs (declPath env)
|
| 1242 | 1241 | return (this_loc (XExpr $ HsTick tickish $ this_loc e))
|
| 1243 | 1242 | |
| 1244 | -recSelTick :: Id -> TM (Maybe CoreTickish)
|
|
| 1243 | +recSelTick :: Id -> TM (Maybe [CoreTickish])
|
|
| 1245 | 1244 | recSelTick id = ifDensity TickForCoverage maybe_tick (pure Nothing)
|
| 1246 | 1245 | where
|
| 1247 | 1246 | maybe_tick = getEnv >>=
|
| 1248 | - maybe (pure Nothing) tick . (`lookupVarEnv` id) . recSelBinds
|
|
| 1247 | + maybe (pure Nothing) tick_all . (`lookupVarEnv` id) . recSelBinds
|
|
| 1248 | + tick_all = fmap (Just . catMaybes) . mapM tick . dVarSetElems
|
|
| 1249 | 1249 | tick sel = getState >>=
|
| 1250 | 1250 | maybe (alloc sel) (pure . Just) . (`lookupVarEnv` sel) . recSelTicks
|
| 1251 | 1251 | alloc sel = allocATickBox (box sel) False False (getSrcSpan sel) noFVs
|
| ... | ... | @@ -1367,7 +1367,7 @@ class CollectBinders a where |
| 1367 | 1367 | --
|
| 1368 | 1368 | -- See Note [Record-selector ticks].
|
| 1369 | 1369 | class CollectFldBinders a where
|
| 1370 | - collectFldBinds :: a -> IdEnv Id
|
|
| 1370 | + collectFldBinds :: a -> IdEnv DVarSet
|
|
| 1371 | 1371 | |
| 1372 | 1372 | instance CollectBinders (LocatedA (Pat GhcTc)) where
|
| 1373 | 1373 | collectBinds = collectPatBinders CollNoDictBinders
|
| ... | ... | @@ -1385,41 +1385,37 @@ instance (CollectFldBinders a) => CollectFldBinders [a] where |
| 1385 | 1385 | instance (CollectFldBinders e) => CollectFldBinders (GenLocated l e) where
|
| 1386 | 1386 | collectFldBinds = collectFldBinds . unLoc
|
| 1387 | 1387 | instance CollectFldBinders (Pat GhcTc) where
|
| 1388 | - collectFldBinds ConPat{ pat_args = RecCon HsRecFields{ rec_flds, rec_dotdot } } =
|
|
| 1389 | - collectFldBinds rec_flds `plusVarEnv` plusVarEnvList (zipWith fld_bnds [0..] rec_flds)
|
|
| 1390 | - where n_explicit | Just (L _ (RecFieldsDotDot n)) <- rec_dotdot = n
|
|
| 1391 | - | otherwise = length rec_flds
|
|
| 1392 | - fld_bnds n (L _ HsFieldBind{ hfbLHS = L _ FieldOcc{ foLabel = L _ sel }
|
|
| 1393 | - , hfbRHS = L _ (VarPat _ (L _ var))
|
|
| 1394 | - , hfbPun })
|
|
| 1395 | - | hfbPun || n >= n_explicit = unitVarEnv var sel
|
|
| 1396 | - fld_bnds _ _ = emptyVarEnv
|
|
| 1397 | - collectFldBinds ConPat{ pat_args = PrefixCon pats } = collectFldBinds pats
|
|
| 1398 | - collectFldBinds ConPat{ pat_args = InfixCon p1 p2 } = collectFldBinds [p1, p2]
|
|
| 1399 | - collectFldBinds (LazyPat _ pat) = collectFldBinds pat
|
|
| 1400 | - collectFldBinds (BangPat _ pat) = collectFldBinds pat
|
|
| 1401 | - collectFldBinds (AsPat _ _ pat) = collectFldBinds pat
|
|
| 1402 | - collectFldBinds (ViewPat _ _ pat) = collectFldBinds pat
|
|
| 1403 | - collectFldBinds (ParPat _ pat) = collectFldBinds pat
|
|
| 1404 | - collectFldBinds (ListPat _ pats) = collectFldBinds pats
|
|
| 1405 | - collectFldBinds (TuplePat _ pats _) = collectFldBinds pats
|
|
| 1406 | - collectFldBinds (SumPat _ pats _ _) = collectFldBinds pats
|
|
| 1407 | - collectFldBinds (SigPat _ pat _) = collectFldBinds pat
|
|
| 1408 | - collectFldBinds (XPat exp) = collectFldBinds exp
|
|
| 1409 | - collectFldBinds VarPat{} = emptyVarEnv
|
|
| 1410 | - collectFldBinds WildPat{} = emptyVarEnv
|
|
| 1411 | - collectFldBinds OrPat{} = emptyVarEnv
|
|
| 1412 | - collectFldBinds LitPat{} = emptyVarEnv
|
|
| 1413 | - collectFldBinds NPat{} = emptyVarEnv
|
|
| 1414 | - collectFldBinds NPlusKPat{} = emptyVarEnv
|
|
| 1415 | - collectFldBinds SplicePat{} = emptyVarEnv
|
|
| 1416 | - collectFldBinds EmbTyPat{} = emptyVarEnv
|
|
| 1417 | - collectFldBinds InvisPat{} = emptyVarEnv
|
|
| 1418 | -instance (CollectFldBinders r) => CollectFldBinders (HsFieldBind l r) where
|
|
| 1419 | - collectFldBinds = collectFldBinds . hfbRHS
|
|
| 1420 | -instance CollectFldBinders XXPatGhcTc where
|
|
| 1421 | - collectFldBinds (CoPat _ pat _) = collectFldBinds pat
|
|
| 1422 | - collectFldBinds (ExpansionPat _ pat) = collectFldBinds pat
|
|
| 1388 | + collectFldBinds = go emptyDVarSet where
|
|
| 1389 | + go sels ConPat{ pat_args = RecCon HsRecFields{ rec_flds } } =
|
|
| 1390 | + plusVarEnvList (map fld_binds rec_flds)
|
|
| 1391 | + where fld_binds (L _ HsFieldBind{ hfbLHS = L _ FieldOcc{ foLabel = L _ sel }
|
|
| 1392 | + , hfbRHS = L _ rhs })
|
|
| 1393 | + = go (extendDVarSet sels sel) rhs
|
|
| 1394 | + go sels ConPat{ pat_args = PrefixCon ps } =
|
|
| 1395 | + plusVarEnvList (map (go sels . unLoc) ps)
|
|
| 1396 | + go sels ConPat{ pat_args = InfixCon (L _ p1) (L _ p2) } =
|
|
| 1397 | + go sels p1 `plusVarEnv` go sels p2
|
|
| 1398 | + go sels (VarPat _ (L _ var)) | isEmptyDVarSet sels = emptyVarEnv
|
|
| 1399 | + | otherwise = unitVarEnv var sels
|
|
| 1400 | + go sels (LazyPat _ (L _ p)) = go sels p
|
|
| 1401 | + go sels (BangPat _ (L _ p)) = go sels p
|
|
| 1402 | + go sels (AsPat _ _ (L _ p)) = go sels p
|
|
| 1403 | + go sels (ViewPat _ _ (L _ p)) = go sels p
|
|
| 1404 | + go sels (ParPat _ (L _ p)) = go sels p
|
|
| 1405 | + go sels (SigPat _ (L _ p) _) = go sels p
|
|
| 1406 | + go sels (SumPat _ (L _ p) _ _) = go sels p
|
|
| 1407 | + go sels (XPat (CoPat _ p _)) = go sels p
|
|
| 1408 | + go sels (XPat (ExpansionPat _ p)) = go sels p
|
|
| 1409 | + go sels (ListPat _ ps) = plusVarEnvList (map (go sels . unLoc) ps)
|
|
| 1410 | + go sels (TuplePat _ ps _) = plusVarEnvList (map (go sels . unLoc) ps)
|
|
| 1411 | + go _ WildPat{} = emptyVarEnv
|
|
| 1412 | + go _ OrPat{} = emptyVarEnv
|
|
| 1413 | + go _ LitPat{} = emptyVarEnv
|
|
| 1414 | + go _ NPat{} = emptyVarEnv
|
|
| 1415 | + go _ NPlusKPat{} = emptyVarEnv
|
|
| 1416 | + go _ SplicePat{} = emptyVarEnv
|
|
| 1417 | + go _ EmbTyPat{} = emptyVarEnv
|
|
| 1418 | + go _ InvisPat{} = emptyVarEnv
|
|
| 1423 | 1419 | instance CollectFldBinders (HsLocalBinds GhcTc) where
|
| 1424 | 1420 | collectFldBinds (HsValBinds _ bnds) = collectFldBinds bnds
|
| 1425 | 1421 | collectFldBinds HsIPBinds{} = emptyVarEnv
|
| ... | ... | @@ -1430,9 +1426,9 @@ instance CollectFldBinders (HsValBinds GhcTc) where |
| 1430 | 1426 | instance CollectFldBinders (HsBind GhcTc) where
|
| 1431 | 1427 | collectFldBinds PatBind{ pat_lhs } = collectFldBinds pat_lhs
|
| 1432 | 1428 | collectFldBinds (XHsBindsLR AbsBinds{ abs_exports, abs_binds }) =
|
| 1433 | - mkVarEnv [ (abe_poly, sel)
|
|
| 1429 | + mkVarEnv [ (abe_poly, sels)
|
|
| 1434 | 1430 | | ABE{ abe_poly, abe_mono } <- abs_exports
|
| 1435 | - , Just sel <- [lookupVarEnv monos abe_mono] ]
|
|
| 1431 | + , Just sels <- [lookupVarEnv monos abe_mono] ]
|
|
| 1436 | 1432 | where monos = collectFldBinds abs_binds
|
| 1437 | 1433 | collectFldBinds VarBind{} = emptyVarEnv
|
| 1438 | 1434 | collectFldBinds FunBind{} = emptyVarEnv
|
| 1 | -.. _release-9-14-1:
|
|
| 2 | - |
|
| 3 | -Version 9.14.1
|
|
| 4 | -==============
|
|
| 5 | - |
|
| 6 | -The significant changes to the various parts of the compiler are listed in the
|
|
| 7 | -following sections. See the `migration guide
|
|
| 8 | -<https://gitlab.haskell.org/ghc/ghc/-/wikis/migration/9.14>`_ on the GHC Wiki
|
|
| 9 | -for specific guidance on migrating programs to this release.
|
|
| 10 | - |
|
| 11 | -Language
|
|
| 12 | -~~~~~~~~
|
|
| 13 | - |
|
| 14 | -* `GHC proposal 493: allow expressions in SPECIALISE pragmas <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0493-specialise-expressions.rst>`_
|
|
| 15 | - has been implemented. SPECIALISE pragmas now allow arbitrary expressions such as: ::
|
|
| 16 | - |
|
| 17 | - {-# SPECIALISE f @Int False :: Int -> Char #-}
|
|
| 18 | - |
|
| 19 | - The ability to specify multiple specialisations in a single SPECIALISE pragma,
|
|
| 20 | - with syntax of the form (note the comma between the type signatures): ::
|
|
| 21 | - |
|
| 22 | - {-# SPECIALISE g : Int -> Int, Float -> Float #-}
|
|
| 23 | - |
|
| 24 | - has been deprecated, and is scheduled to be removed in GHC 9.18.
|
|
| 25 | - This deprecation is controlled by the newly introduced ``-Wdeprecated-pragmas``
|
|
| 26 | - flag in ``-Wdefault``.
|
|
| 27 | - |
|
| 28 | -* ``-Wincomplete-record-selectors`` is now part of `-Wall`, as specified
|
|
| 29 | - by `GHC Proposal 516: add warning for incomplete record selectors <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0516-incomplete-record-selectors.rst>`_.
|
|
| 30 | - Hence, if a library is compiled with ``-Werror``, compilation may now fail. Solution: fix the library.
|
|
| 31 | - Workaround: add ``-Werror=no-incomplete-record-selectors``.
|
|
| 32 | - |
|
| 33 | - Note that this warning is at least
|
|
| 34 | - as serious as a warning about missing patterns from a function definition, perhaps even
|
|
| 35 | - more so, since it is invisible in the source program.
|
|
| 36 | - |
|
| 37 | -* The combination of :extension:`ScopedTypeVariables` and :extension:`TypeApplications`
|
|
| 38 | - no longer enables type applications in patterns, which now always requires
|
|
| 39 | - :extension:`TypeAbstractions`. The warning flag``deprecated-type-abstractions``
|
|
| 40 | - has also been removed from the compiler.
|
|
| 41 | - |
|
| 42 | -* :extension:`OverloadedRecordUpdate` now passes the arguments to a ``setField`` function
|
|
| 43 | - in the flipped order, as specified by `GHC Proposal 583: HasField redesign <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0583-hasfield-redesign.rst>`_.
|
|
| 44 | - |
|
| 45 | - Previously GHC expected ``setField`` to have this type: ::
|
|
| 46 | - |
|
| 47 | - setField :: forall (fld :: Symbol) a r. r -> a -> r
|
|
| 48 | - |
|
| 49 | - And that's what GHC expects now: ::
|
|
| 50 | - |
|
| 51 | - setField :: forall (fld :: Symbol) a r. a -> r -> r
|
|
| 52 | - |
|
| 53 | - That will break the combination of :extension:`OverloadedRecordUpdate` with :extension:`RebindableSyntax`.
|
|
| 54 | - |
|
| 55 | -* Multiline strings are now accepted in foreign imports. (#25157)
|
|
| 56 | - |
|
| 57 | -* GHC now does a better job at inferring types in calls to ``coerce``: instead of
|
|
| 58 | - complaining about ambiguous type variables, GHC will consider that such type
|
|
| 59 | - variables are determined by the ``Coercible`` constraints they appear in.
|
|
| 60 | - |
|
| 61 | -* With :extension:`LinearTypes` record fields can now be non-linear. This means that
|
|
| 62 | - the following record declaration is now valid:
|
|
| 63 | - |
|
| 64 | - ::
|
|
| 65 | - |
|
| 66 | - data Record = Rec { x %'Many :: Int, y :: Char }
|
|
| 67 | - |
|
| 68 | - This causes the constructor to have type ``Rec :: Int %'Many -> Char %1 -> Record``.
|
|
| 69 | - |
|
| 70 | -* The :extension:`ExplicitNamespaces` extension now allows the ``data``
|
|
| 71 | - namespace specifier in import and export lists.
|
|
| 72 | - |
|
| 73 | -* The ``-Wdata-kinds-tc`` warning has been deprecated, and the use of promoted
|
|
| 74 | - data types in kinds is now an error (rather than a warning) unless the
|
|
| 75 | - :extension:`DataKinds` extension is enabled. For example, the following code
|
|
| 76 | - will be rejected unless :extension:`DataKinds` is on:
|
|
| 77 | - |
|
| 78 | - import Data.Kind (Type)
|
|
| 79 | - import GHC.TypeNats (Nat)
|
|
| 80 | - |
|
| 81 | - -- Nat shouldn't be allowed here without DataKinds
|
|
| 82 | - data Vec :: Nat -> Type -> Type
|
|
| 83 | - |
|
| 84 | - (The ``-Wdata-kinds-tc`` warning was introduced in GHC 9.10 as part of a fix
|
|
| 85 | - for an accidental oversight in which programs like the one above were
|
|
| 86 | - mistakenly accepted without the use of :extension:`DataKinds`.)
|
|
| 87 | - |
|
| 88 | -* The :extension:`MonadComprehensions` extension now implies :extension:`ParallelListComp` as was originally intended (see `Monad Comprehensions <https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/monad_comprehensions.html>`_).
|
|
| 89 | - |
|
| 90 | -* In accordance with `GHC Proposal #281 <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0281-visible-forall.rst>`_,
|
|
| 91 | - section 4.7 "Data constructors", the :extension:`RequiredTypeArguments`
|
|
| 92 | - extension now allows visible forall in types of data constructors
|
|
| 93 | - (:ghc-ticket:`25127`). The following declaration is now accepted by GHC:
|
|
| 94 | - |
|
| 95 | - ::
|
|
| 96 | - |
|
| 97 | - data T a where
|
|
| 98 | - Typed :: forall a -> a -> T a
|
|
| 99 | - |
|
| 100 | - See :ref:`visible-forall-in-gadts` for details.
|
|
| 101 | - |
|
| 102 | -Compiler
|
|
| 103 | -~~~~~~~~
|
|
| 104 | - |
|
| 105 | -- An improved error message is introduced to refer users to the heap-controlling flags of the RTS when there is a heap overflow during compilation. (#25198)
|
|
| 106 | - |
|
| 107 | -- The kind checker now does a better job of finding type family instances for
|
|
| 108 | - use in the kinds of other declarations in the same module. This fixes a number
|
|
| 109 | - of tickets:
|
|
| 110 | - :ghc-ticket:`12088`, :ghc-ticket:`12239`, :ghc-ticket:`14668`, :ghc-ticket:`15561`,
|
|
| 111 | - :ghc-ticket:`16410`, :ghc-ticket:`16448`, :ghc-ticket:`16693`, :ghc-ticket:`19611`,
|
|
| 112 | - :ghc-ticket:`20875`, :ghc-ticket:`21172`, :ghc-ticket:`22257`, :ghc-ticket:`25238`,
|
|
| 113 | - :ghc-ticket:`25834`.
|
|
| 114 | - |
|
| 115 | -- The compiler no longer accepts invalid ``type`` namespace specifiers in
|
|
| 116 | - subordinate import lists (:ghc-ticket:`22581`).
|
|
| 117 | - |
|
| 118 | -- A new flag, :ghc-flag:`-Wuseless-specialisations`, controls warnings emitted when GHC
|
|
| 119 | - determines that a SPECIALISE pragma would have no effect.
|
|
| 120 | - |
|
| 121 | -- A new flag, :ghc-flag:`-Wrule-lhs-equalities`, controls warnings emitted for RULES
|
|
| 122 | - whose left-hand side attempts to quantify over equality constraints that
|
|
| 123 | - previous GHC versions accepted quantifying over. GHC will now drop such RULES,
|
|
| 124 | - emitting a warning message controlled by this flag.
|
|
| 125 | - |
|
| 126 | - This warning is intended to give visibility to the fact that the RULES that
|
|
| 127 | - previous GHC versions generated in such circumstances could never fire.
|
|
| 128 | - |
|
| 129 | -- A new flag, :ghc-flag:`-Wunusable-unpack-pragmas`, controls warnings emitted
|
|
| 130 | - when GHC is unable to unpack a data constructor field annotated by the
|
|
| 131 | - ``{-# UNPACK #-}`` pragma.
|
|
| 132 | - |
|
| 133 | - Previous GHC versions issued this warning unconditionally. Now it is possible
|
|
| 134 | - to disable it with ``-Wno-unusable-unpack-pragmas`` or turn it into an error
|
|
| 135 | - with ``-Werror=unusable-unpack-pragmas``.
|
|
| 136 | - |
|
| 137 | -- Introduce a new warning :ghc-flag:`-Wpattern-namespace-specifier` to detect
|
|
| 138 | - uses of the now deprecated ``pattern`` namespace specifier in import/export
|
|
| 139 | - lists. See `GHC Proposal #581, section 2.3 <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0581-namespace-specified-imports.rst#deprecate-use-of-pattern-in-import-export-lists>`_.
|
|
| 140 | - |
|
| 141 | -- Code coverage (:ghc-flag:`-fhpc`) now treats uses of record fields via
|
|
| 142 | - :extension:`RecordWildCards` or :extension:`NamedFieldPuns` as if the fields
|
|
| 143 | - were accessed using the generated record selector functions, marking the fields
|
|
| 144 | - as covered in coverage reports (:ghc-ticket:`17834`).
|
|
| 145 | - |
|
| 146 | -- SIMD support in the X86 native code generator has been extended with 128-bit
|
|
| 147 | - integer operations. Also, ``shuffleFloatX4#`` and ``shuffleDoubleX2#`` no longer
|
|
| 148 | - require ``-mavx``.
|
|
| 149 | - |
|
| 150 | -- JSON diagnostics produced with (:ghc-flag:`-fdiagnostics-as-json`) now
|
|
| 151 | - include the `rendered` diagnostics message, in the exact same format as what
|
|
| 152 | - GHC would have produced without -fdiagnostics-as-json (including ANSI escape
|
|
| 153 | - sequences).
|
|
| 154 | - |
|
| 155 | -GHCi
|
|
| 156 | -~~~~
|
|
| 157 | - |
|
| 158 | -- :ghci-cmd:`:info` now outputs type declarations with @-binders that are
|
|
| 159 | - considered semantically significant. See the documentation for :ghci-cmd:`:info`
|
|
| 160 | - itself for a more detailed explanation.
|
|
| 161 | - |
|
| 162 | -- GHCi errors and warnings now have their own numeric error codes that are
|
|
| 163 | - displayed alongside the error.
|
|
| 164 | - |
|
| 165 | -Runtime system
|
|
| 166 | -~~~~~~~~~~~~~~
|
|
| 167 | - |
|
| 168 | -- Add new runtime flag :rts-flag:`--optimistic-linking` which instructs the
|
|
| 169 | - runtime linker to continue in the presence of unknown symbols. By default this
|
|
| 170 | - flag is not passed, preserving previous behavior.
|
|
| 171 | - |
|
| 172 | -Cmm
|
|
| 173 | -~~~
|
|
| 174 | - |
|
| 175 | -``base`` library
|
|
| 176 | -~~~~~~~~~~~~~~~~
|
|
| 177 | - |
|
| 178 | -``ghc-prim`` library
|
|
| 179 | -~~~~~~~~~~~~~~~~~~~~
|
|
| 180 | - |
|
| 181 | -``ghc`` library
|
|
| 182 | -~~~~~~~~~~~~~~~
|
|
| 183 | - |
|
| 184 | -* The `UnknownDiagnostic` constructor now takes an additional type argument
|
|
| 185 | - for the type of hints corresponding to the diagnostic, and an additional
|
|
| 186 | - value-level argument used for existential wrapping of the hints of the inner
|
|
| 187 | - diagnostic.
|
|
| 188 | - |
|
| 189 | -* Changes to the HPT and HUG interface:
|
|
| 190 | - |
|
| 191 | - - `addToHpt` and `addListToHPT` were moved from `GHC.Unit.Home.ModInfo` to `GHC.Unit.Home.PackageTable` and deprecated in favour of `addHomeModInfoToHpt` and `addHomeModInfosToHpt`.
|
|
| 192 | - - `UnitEnvGraph` and operations `unitEnv_lookup_maybe`, `unitEnv_foldWithKey, `unitEnv_singleton`, `unitEnv_adjust`, `unitEnv_insert`, `unitEnv_new` were moved from `GHC.Unit.Env` to `GHC.Unit.Home.Graph`.
|
|
| 193 | - - The HomePackageTable (HPT) is now exported from `GHC.Unit.Home.PackageTable`,
|
|
| 194 | - and is now backed by an IORef to avoid by construction very bad memory leaks.
|
|
| 195 | - This means the API to the HPT now is for the most part in IO. For instance,
|
|
| 196 | - `emptyHomePackageTable` and `addHomeModInfoToHpt` are now in IO.
|
|
| 197 | - - `mkHomeUnitEnv` was moved to `GHC.Unit.Home.PackageTable`, and now takes two
|
|
| 198 | - extra explicit arguments. To restore previous behaviour, pass `emptyUnitState`
|
|
| 199 | - and `Nothing` as the first two arguments additionally.
|
|
| 200 | - - `hugElts` was removed. Users should prefer `allUnits` to get the keys of the
|
|
| 201 | - HUG (the typical use case), or `traverse` or `unitEnv_foldWithKey` in other
|
|
| 202 | - cases.
|
|
| 203 | - |
|
| 204 | -* Changes to `Language.Haskell.Syntax.Expr`
|
|
| 205 | - |
|
| 206 | - - The `ParStmtBlock` list argument of the `ParStmt` constructor of `StmtLR` is now `NonEmpty`.
|
|
| 207 | - |
|
| 208 | -* As part of the implementation of `GHC proposal 493 <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0493-specialise-expressions.rst>`_,
|
|
| 209 | - the `SpecSig` constructor of `Sig` has been deprecated. It is replaced by
|
|
| 210 | - the constructor `SpecSigE` which supports expressions at the head, rather than
|
|
| 211 | - a lone variable.
|
|
| 212 | - |
|
| 213 | -``ghc-heap`` library
|
|
| 214 | -~~~~~~~~~~~~~~~~~~~~
|
|
| 215 | - |
|
| 216 | -* The functions `getClosureInfoTbl_maybe`, `getClosureInfoTbl`,
|
|
| 217 | - `getClosurePtrArgs` and `getClosurePtrArgs_maybe` have been added to allow
|
|
| 218 | - reading of the relevant Closure attributes without reliance on incomplete
|
|
| 219 | - selectors.
|
|
| 220 | - |
|
| 221 | -``ghc-experimental`` library
|
|
| 222 | -~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 223 | - |
|
| 224 | -- ``ghc-experimental`` now exposes ``GHC.RTS.Flags`` and ``GHC.Stats`` as
|
|
| 225 | - ``GHC.RTS.Flags.Experimental`` and ``GHC.Stats.Experimental``. These are
|
|
| 226 | - *also* exposed in ``base``, however the ``base`` versions will be deprecated as
|
|
| 227 | - part of the split base project. See `CLC proposal 289
|
|
| 228 | - <https://github.com/haskell/core-libraries-committee/issues/289>`__.
|
|
| 229 | - Downstream consumers of these flags are encouraged to migrate to the
|
|
| 230 | - ``ghc-experimental`` versions.
|
|
| 231 | - |
|
| 232 | - |
|
| 233 | - |
|
| 234 | -``template-haskell`` library
|
|
| 235 | -~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 236 | - |
|
| 237 | -- As part of the implementation of `GHC proposal 493 <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0493-specialise-expressions.rst>`_,
|
|
| 238 | - the ``SpecialiseP`` constructor of the Template Haskell ``Pragma`` type, as
|
|
| 239 | - well as the helpers ``pragSpecD`` and ``pragSpecInlD``, have been deprecated.
|
|
| 240 | - |
|
| 241 | - They are replaced, respectively, by ``SpecialiseEP``, ``pragSpecED`` and
|
|
| 242 | - ``pragSpecInlED``.
|
|
| 243 | - |
|
| 244 | -Included libraries
|
|
| 245 | -~~~~~~~~~~~~~~~~~~
|
|
| 246 | - |
|
| 247 | -The package database provided with this distribution also contains a number of
|
|
| 248 | -packages other than GHC itself. See the changelogs provided with these packages
|
|
| 249 | -for further change information.
|
|
| 250 | - |
|
| 251 | -.. ghc-package-list::
|
|
| 252 | - |
|
| 253 | - libraries/array/array.cabal: Dependency of ``ghc`` library
|
|
| 254 | - libraries/base/base.cabal: Core library
|
|
| 255 | - libraries/binary/binary.cabal: Dependency of ``ghc`` library
|
|
| 256 | - libraries/bytestring/bytestring.cabal: Dependency of ``ghc`` library
|
|
| 257 | - libraries/Cabal/Cabal/Cabal.cabal: Dependency of ``ghc-pkg`` utility
|
|
| 258 | - libraries/Cabal/Cabal-syntax/Cabal-syntax.cabal: Dependency of ``ghc-pkg`` utility
|
|
| 259 | - libraries/containers/containers/containers.cabal: Dependency of ``ghc`` library
|
|
| 260 | - libraries/deepseq/deepseq.cabal: Dependency of ``ghc`` library
|
|
| 261 | - libraries/directory/directory.cabal: Dependency of ``ghc`` library
|
|
| 262 | - libraries/exceptions/exceptions.cabal: Dependency of ``ghc`` and ``haskeline`` library
|
|
| 263 | - libraries/filepath/filepath.cabal: Dependency of ``ghc`` library
|
|
| 264 | - compiler/ghc.cabal: The compiler itself
|
|
| 265 | - libraries/ghci/ghci.cabal: The REPL interface
|
|
| 266 | - libraries/ghc-boot/ghc-boot.cabal: Internal compiler library
|
|
| 267 | - libraries/ghc-boot-th/ghc-boot-th.cabal: Internal compiler library
|
|
| 268 | - libraries/ghc-compact/ghc-compact.cabal: Core library
|
|
| 269 | - libraries/ghc-heap/ghc-heap.cabal: GHC heap-walking library
|
|
| 270 | - libraries/ghc-prim/ghc-prim.cabal: Core library
|
|
| 271 | - utils/haddock/haddock-api/haddock-api.cabal: Dependency of ``haddock`` executable
|
|
| 272 | - utils/haddock/haddock-library/haddock-library.cabal: Dependency of ``haddock`` executable
|
|
| 273 | - libraries/haskeline/haskeline.cabal: Dependency of ``ghci`` executable
|
|
| 274 | - libraries/hpc/hpc.cabal: Dependency of ``hpc`` executable
|
|
| 275 | - libraries/integer-gmp/integer-gmp.cabal: Core library
|
|
| 276 | - libraries/mtl/mtl.cabal: Dependency of ``Cabal`` library
|
|
| 277 | - libraries/parsec/parsec.cabal: Dependency of ``Cabal`` library
|
|
| 278 | - libraries/pretty/pretty.cabal: Dependency of ``ghc`` library
|
|
| 279 | - libraries/process/process.cabal: Dependency of ``ghc`` library
|
|
| 280 | - libraries/stm/stm.cabal: Dependency of ``haskeline`` library
|
|
| 281 | - libraries/template-haskell/template-haskell.cabal: Core library
|
|
| 282 | - libraries/terminfo/terminfo.cabal: Dependency of ``haskeline`` library
|
|
| 283 | - libraries/text/text.cabal: Dependency of ``Cabal`` library
|
|
| 284 | - libraries/time/time.cabal: Dependency of ``ghc`` library
|
|
| 285 | - libraries/transformers/transformers.cabal: Dependency of ``ghc`` library
|
|
| 286 | - libraries/unix/unix.cabal: Dependency of ``ghc`` library
|
|
| 287 | - libraries/Win32/Win32.cabal: Dependency of ``ghc`` library
|
|
| 288 | - libraries/xhtml/xhtml.cabal: Dependency of ``haddock`` executable
|
|
| 289 | - libraries/os-string/os-string.cabal: Dependency of ``filepath`` library
|
|
| 290 | - libraries/file-io/file-io.cabal: Dependency of ``directory`` library |
| 1 | +.. _release-9-16-1:
|
|
| 2 | + |
|
| 3 | +Version 9.16.1
|
|
| 4 | +==============
|
|
| 5 | + |
|
| 6 | +The significant changes to the various parts of the compiler are listed in the
|
|
| 7 | +following sections. See the `migration guide
|
|
| 8 | +<https://gitlab.haskell.org/ghc/ghc/-/wikis/migration/9.16>`_ on the GHC Wiki
|
|
| 9 | +for specific guidance on migrating programs to this release.
|
|
| 10 | + |
|
| 11 | +Language
|
|
| 12 | +~~~~~~~~
|
|
| 13 | + |
|
| 14 | +Compiler
|
|
| 15 | +~~~~~~~~
|
|
| 16 | + |
|
| 17 | +- Code coverage's (:ghc-flag:`-fhpc`) treatment of record fields now extends
|
|
| 18 | + beyond record fields accessed via :extension:`RecordWildCards` and
|
|
| 19 | + :extension:`NamedFieldPuns`, and also handles access to nested record fields.
|
|
| 20 | + That is, in a pattern such as ``Foo{bar = Bar{baz = b}}`` both ``bar`` and
|
|
| 21 | + ``baz`` will now be marked as covered if ``b`` is evaluated. Note that this
|
|
| 22 | + currently only works when record fields (or values contained within them) are
|
|
| 23 | + bound to variables. The very similar pattern ``Foo{bar = Bar{baz = 42}}``
|
|
| 24 | + will will not yet mark ``bar`` or ``baz`` as covered.
|
|
| 25 | + |
|
| 26 | +GHCi
|
|
| 27 | +~~~~
|
|
| 28 | + |
|
| 29 | +Runtime system
|
|
| 30 | +~~~~~~~~~~~~~~
|
|
| 31 | + |
|
| 32 | +Cmm
|
|
| 33 | +~~~
|
|
| 34 | + |
|
| 35 | +``base`` library
|
|
| 36 | +~~~~~~~~~~~~~~~~
|
|
| 37 | + |
|
| 38 | +``ghc-prim`` library
|
|
| 39 | +~~~~~~~~~~~~~~~~~~~~
|
|
| 40 | + |
|
| 41 | +``ghc`` library
|
|
| 42 | +~~~~~~~~~~~~~~~
|
|
| 43 | + |
|
| 44 | +``ghc-heap`` library
|
|
| 45 | +~~~~~~~~~~~~~~~~~~~~
|
|
| 46 | + |
|
| 47 | +``ghc-experimental`` library
|
|
| 48 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 49 | + |
|
| 50 | +``template-haskell`` library
|
|
| 51 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 52 | + |
|
| 53 | +Included libraries
|
|
| 54 | +~~~~~~~~~~~~~~~~~~
|
|
| 55 | + |
|
| 56 | +The package database provided with this distribution also contains a number of
|
|
| 57 | +packages other than GHC itself. See the changelogs provided with these packages
|
|
| 58 | +for further change information.
|
|
| 59 | + |
|
| 60 | +.. ghc-package-list::
|
|
| 61 | + |
|
| 62 | + libraries/array/array.cabal: Dependency of ``ghc`` library
|
|
| 63 | + libraries/base/base.cabal: Core library
|
|
| 64 | + libraries/binary/binary.cabal: Dependency of ``ghc`` library
|
|
| 65 | + libraries/bytestring/bytestring.cabal: Dependency of ``ghc`` library
|
|
| 66 | + libraries/Cabal/Cabal/Cabal.cabal: Dependency of ``ghc-pkg`` utility
|
|
| 67 | + libraries/Cabal/Cabal-syntax/Cabal-syntax.cabal: Dependency of ``ghc-pkg`` utility
|
|
| 68 | + libraries/containers/containers/containers.cabal: Dependency of ``ghc`` library
|
|
| 69 | + libraries/deepseq/deepseq.cabal: Dependency of ``ghc`` library
|
|
| 70 | + libraries/directory/directory.cabal: Dependency of ``ghc`` library
|
|
| 71 | + libraries/exceptions/exceptions.cabal: Dependency of ``ghc`` and ``haskeline`` library
|
|
| 72 | + libraries/filepath/filepath.cabal: Dependency of ``ghc`` library
|
|
| 73 | + compiler/ghc.cabal: The compiler itself
|
|
| 74 | + libraries/ghci/ghci.cabal: The REPL interface
|
|
| 75 | + libraries/ghc-boot/ghc-boot.cabal: Internal compiler library
|
|
| 76 | + libraries/ghc-boot-th/ghc-boot-th.cabal: Internal compiler library
|
|
| 77 | + libraries/ghc-compact/ghc-compact.cabal: Core library
|
|
| 78 | + libraries/ghc-heap/ghc-heap.cabal: GHC heap-walking library
|
|
| 79 | + libraries/ghc-prim/ghc-prim.cabal: Core library
|
|
| 80 | + utils/haddock/haddock-api/haddock-api.cabal: Dependency of ``haddock`` executable
|
|
| 81 | + utils/haddock/haddock-library/haddock-library.cabal: Dependency of ``haddock`` executable
|
|
| 82 | + libraries/haskeline/haskeline.cabal: Dependency of ``ghci`` executable
|
|
| 83 | + libraries/hpc/hpc.cabal: Dependency of ``hpc`` executable
|
|
| 84 | + libraries/integer-gmp/integer-gmp.cabal: Core library
|
|
| 85 | + libraries/mtl/mtl.cabal: Dependency of ``Cabal`` library
|
|
| 86 | + libraries/parsec/parsec.cabal: Dependency of ``Cabal`` library
|
|
| 87 | + libraries/pretty/pretty.cabal: Dependency of ``ghc`` library
|
|
| 88 | + libraries/process/process.cabal: Dependency of ``ghc`` library
|
|
| 89 | + libraries/stm/stm.cabal: Dependency of ``haskeline`` library
|
|
| 90 | + libraries/template-haskell/template-haskell.cabal: Core library
|
|
| 91 | + libraries/terminfo/terminfo.cabal: Dependency of ``haskeline`` library
|
|
| 92 | + libraries/text/text.cabal: Dependency of ``Cabal`` library
|
|
| 93 | + libraries/time/time.cabal: Dependency of ``ghc`` library
|
|
| 94 | + libraries/transformers/transformers.cabal: Dependency of ``ghc`` library
|
|
| 95 | + libraries/unix/unix.cabal: Dependency of ``ghc`` library
|
|
| 96 | + libraries/Win32/Win32.cabal: Dependency of ``ghc`` library
|
|
| 97 | + libraries/xhtml/xhtml.cabal: Dependency of ``haddock`` executable
|
|
| 98 | + libraries/os-string/os-string.cabal: Dependency of ``filepath`` library
|
|
| 99 | + libraries/file-io/file-io.cabal: Dependency of ``directory`` library |
| ... | ... | @@ -4,4 +4,4 @@ Release notes |
| 4 | 4 | .. toctree::
|
| 5 | 5 | :maxdepth: 1
|
| 6 | 6 | |
| 7 | - 9.14.1-notes |
|
| 7 | + 9.16.1-notes |
| ... | ... | @@ -10,7 +10,8 @@ import Trace.Hpc.Tix |
| 10 | 10 | import Trace.Hpc.Reflect
|
| 11 | 11 | |
| 12 | 12 | data Foo = Foo { fooA, fooB, fooC, fooD, fooE, fooF, fooG, fooH, fooI
|
| 13 | - , fooJ, fooK, fooL, fooM, fooN, fooO :: Int }
|
|
| 13 | + , fooJ, fooK, fooL, fooM, fooN, fooO :: Int
|
|
| 14 | + , fooP, fooQ :: Maybe Int }
|
|
| 14 | 15 | data Bar = Bar { barFoo :: Foo }
|
| 15 | 16 | |
| 16 | 17 | fAB Foo{..} = fooA + fooB
|
| ... | ... | @@ -35,14 +36,17 @@ fL = runIdentity . runKleisli (proc f -> do |
| 35 | 36 | fM f | Foo{..} <- f = fooM
|
| 36 | 37 | fN f = fooN f
|
| 37 | 38 | fO = runIdentity . runKleisli (proc Foo{..} -> returnA -< fooO)
|
| 39 | +fP Foo{fooP = Just x} = x
|
|
| 40 | +fP _ = 0
|
|
| 41 | +fQ Foo{fooQ = Just 42} = 1
|
|
| 38 | 42 | |
| 39 | 43 | recSel (n, TopLevelBox [s]) | any (`isPrefixOf` s) ["foo", "bar"] = Just (n, s)
|
| 40 | 44 | recSel _ = Nothing
|
| 41 | 45 | |
| 42 | 46 | main = do
|
| 43 | - let foo = Foo 42 23 0 1 2 3 4 5 6 7 0xaffe 9 10 11 12
|
|
| 47 | + let foo = Foo 42 23 0 1 2 3 4 5 6 7 0xaffe 9 10 11 12 (Just 13) (Just 42)
|
|
| 44 | 48 | mapM_ (print . ($ foo))
|
| 45 | - [fAB, fC, fD False, fE . Bar, fF, fG, fH, fI, fJ, fK, fL, fM, fN, fO]
|
|
| 49 | + [fAB, fC, fD False, fE . Bar, fF, fG, fH, fI, fJ, fK, fL, fM, fN, fO, fP, fQ]
|
|
| 46 | 50 | (Mix _ _ _ _ mixs) <- readMix [".hpc"] (Left "Main")
|
| 47 | 51 | let sels = mapMaybe recSel . zip [0..] $ map snd mixs
|
| 48 | 52 | (Tix [TixModule "Main" _ _ tix]) <- examineTix
|
| ... | ... | @@ -12,13 +12,15 @@ |
| 12 | 12 | 10
|
| 13 | 13 | 11
|
| 14 | 14 | 12
|
| 15 | -(0,"barFoo")
|
|
| 15 | +13
|
|
| 16 | +1
|
|
| 17 | +(1,"barFoo")
|
|
| 16 | 18 | (1,"fooA")
|
| 17 | 19 | (1,"fooB")
|
| 18 | 20 | (1,"fooC")
|
| 19 | 21 | (0,"fooD")
|
| 20 | 22 | (1,"fooE")
|
| 21 | -(0,"fooF")
|
|
| 23 | +(1,"fooF")
|
|
| 22 | 24 | (1,"fooG")
|
| 23 | 25 | (1,"fooH")
|
| 24 | 26 | (1,"fooI")
|
| ... | ... | @@ -28,3 +30,5 @@ |
| 28 | 30 | (1,"fooM")
|
| 29 | 31 | (1,"fooN")
|
| 30 | 32 | (1,"fooO")
|
| 33 | +(1,"fooP")
|
|
| 34 | +(0,"fooQ") |