<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en">
<head>
<meta content="text/html; charset=US-ASCII" http-equiv="Content-Type">
<title>
GitLab
</title>

<style data-premailer="ignore" type="text/css">
a { color: #1068bf; }
</style>


<style>img {
max-width: 100%; height: auto;
}
body {
font-size: 0.875rem;
}
body {
-webkit-text-shadow: rgba(255,255,255,0.01) 0 0 1px;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: inherit;
}
</style>
</head>
<body style='font-size: inherit; -webkit-text-shadow: rgba(255,255,255,0.01) 0 0 1px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";'>
<div class="content">

<h3 style="margin-top: 20px; margin-bottom: 10px;">
sheaf pushed to branch wip/wither-eq1-and-friends
at <a href="https://gitlab.haskell.org/ghc/ghc" style="color: #1068bf;">Glasgow Haskell Compiler / GHC</a>
</h3>
<h4 style="margin-top: 10px; margin-bottom: 10px;">
Commits:
</h4>
<ul>
<li>
<strong style="font-weight: bold;"><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/8a666ad2a89a8ad2aa24a6406b88f516afaec671" style="color: #1068bf;">8a666ad2</a></strong>
<div>
<span>by Ryan Scott</span>
<i>at 2022-09-18T08:00:44-04:00</i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 0.8125rem; color: #303030; position: relative; font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; word-break: break-all; word-wrap: break-word; background-color: #fafafa; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dbdbdb;'>DeriveFunctor: Check for last type variables using dataConUnivTyVars

Previously, derived instances of `Functor` (as well as the related classes
`Foldable`, `Traversable`, and `Generic1`) would determine which constraints to
infer by checking for fields that contain the last type variable. The problem
was that this last type variable was taken from `tyConTyVars`. For GADTs, the
type variables in each data constructor are _not_ the same type variables as
in `tyConTyVars`, leading to #22167.

This fixes the issue by instead checking for the last type variable using
`dataConUnivTyVars`. (This is very similar in spirit to the fix for #21185,
which also replaced an errant use of `tyConTyVars` with type variables from
each data constructor.)

Fixes #22167.
</pre>
</li>
<li>
<strong style="font-weight: bold;"><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/780371678fae6cc4ab08a029f5cc35c73de2dc4b" style="color: #1068bf;">78037167</a></strong>
<div>
<span>by Vladislav Zavialov</span>
<i>at 2022-09-18T08:01:20-04:00</i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 0.8125rem; color: #303030; position: relative; font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; word-break: break-all; word-wrap: break-word; background-color: #fafafa; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dbdbdb;'>Lexer: pass updated buffer to actions (#22201)

In the lexer, predicates have the following type:
        { ... } :: user       -- predicate state
                -> AlexInput  -- input stream before the token
                -> Int        -- length of the token
                -> AlexInput  -- input stream after the token
                -> Bool       -- True <=> accept the token
This is documented in the Alex manual.

There is access to the input stream both before and after the token.
But when the time comes to construct the token, GHC passes only the
initial string buffer to the lexer action. This patch fixes it:

        - type Action = PsSpan -> StringBuffer -> Int ->                 P (PsLocated Token)
        + type Action = PsSpan -> StringBuffer -> Int -> StringBuffer -> P (PsLocated Token)

Now lexer actions have access to the string buffer both before and after
the token, just like the predicates. It's just a matter of passing an
additional function parameter throughout the lexer.
</pre>
</li>
<li>
<strong style="font-weight: bold;"><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/7574659452a864e762fa812cb38cf15f70d85617" style="color: #1068bf;">75746594</a></strong>
<div>
<span>by Vladislav Zavialov</span>
<i>at 2022-09-18T08:01:20-04:00</i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 0.8125rem; color: #303030; position: relative; font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; word-break: break-all; word-wrap: break-word; background-color: #fafafa; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dbdbdb;'>Lexer: define varsym without predicates (#22201)

Before this patch, the varsym lexing rules were defined as follows:

        <0> {
          @varsym / { precededByClosingToken `alexAndPred` followedByOpeningToken } { varsym_tight_infix }
          @varsym / { followedByOpeningToken }  { varsym_prefix }
          @varsym / { precededByClosingToken }  { varsym_suffix }
          @varsym                               { varsym_loose_infix }
        }

Unfortunately, this meant that the predicates 'precededByClosingToken' and
'followedByOpeningToken' were recomputed several times before we could figure
out the whitespace context.

With this patch, we check for whitespace context directly in the lexer
action:

        <0> {
          @varsym { with_op_ws varsym }
        }

The checking for opening/closing tokens happens in 'with_op_ws' now,
which is part of the lexer action rather than the lexer predicate.
</pre>
</li>
<li>
<strong style="font-weight: bold;"><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/c1f81b38625a5fea7fb8160a3a62ae6be078a7b1" style="color: #1068bf;">c1f81b38</a></strong>
<div>
<span>by M Farkas-Dyck</span>
<i>at 2022-09-19T09:07:05-04:00</i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 0.8125rem; color: #303030; position: relative; font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; word-break: break-all; word-wrap: break-word; background-color: #fafafa; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dbdbdb;'>Scrub partiality about `NewOrData`.

Rather than a list of constructors and a `NewOrData` flag, we define `data DataDefnCons a = NewTypeCon a | DataTypeCons [a]`, which enforces a newtype to have exactly one constructor.

Closes #22070.

Bump haddock submodule.
</pre>
</li>
<li>
<strong style="font-weight: bold;"><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/1e1ed8c5224a2a2d8ccf502da08a24ce71fd5ac6" style="color: #1068bf;">1e1ed8c5</a></strong>
<div>
<span>by Cheng Shao</span>
<i>at 2022-09-19T09:07:43-04:00</i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 0.8125rem; color: #303030; position: relative; font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; word-break: break-all; word-wrap: break-word; background-color: #fafafa; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dbdbdb;'>CmmToC: emit __builtin_unreachable() after noreturn ccalls

Emit a __builtin_unreachable() call after a foreign call marked as
CmmNeverReturns. This is crucial to generate correctly typed code for
wasm; as for other archs, this is also beneficial for the C compiler
optimizations.
</pre>
</li>
<li>
<strong style="font-weight: bold;"><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/e729e45e577a923caaa2c72bf555611eb917d83d" style="color: #1068bf;">e729e45e</a></strong>
<div>
<span>by John Ericson</span>
<i>at 2022-09-19T15:11:23+02:00</i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 0.8125rem; color: #303030; position: relative; font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; word-break: break-all; word-wrap: break-word; background-color: #fafafa; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dbdbdb;'>Add `Eq` and `Ord` instances for `Generically1`

These are needed so the subsequent commit overhauling the `*1` classes
type-checks.
</pre>
</li>
<li>
<strong style="font-weight: bold;"><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/a9a844fdfcc3aa3eecf36238c0e0a74b550d9482" style="color: #1068bf;">a9a844fd</a></strong>
<div>
<span>by John Ericson</span>
<i>at 2022-09-19T15:11:23+02:00</i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 0.8125rem; color: #303030; position: relative; font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; word-break: break-all; word-wrap: break-word; background-color: #fafafa; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dbdbdb;'>Relax instances for Functor combinators; put superclass on Class1 and Class2 to make non-breaking

This change is approved by the Core Libraries commitee in
https://github.com/haskell/core-libraries-committee/issues/10

The first change makes the `Eq`, `Ord`, `Show`, and `Read` instances for
`Sum`, `Product`, and `Compose` match those for `:+:`, `:*:`, and `:.:`.
These have the proper flexible contexts that are exactly what the
instance needs:

For example, instead of
```haskell
instance (Eq1 f, Eq1 g, Eq a) => Eq (Compose f g a) where
  (==) = eq1
```
we do
```haskell
deriving instance Eq (f (g a)) => Eq (Compose f g a)
```

But, that change alone is rather breaking, because until now `Eq (f a)`
and `Eq1 f` (and respectively the other classes and their `*1`
equivalents too) are *incomparable* constraints. This has always been an
annoyance of working with the `*1` classes, and now it would rear it's
head one last time as an pesky migration.

Instead, we give the `*1` classes superclasses, like so:
```haskell
(forall a. Eq a => Eq (f a)) => Eq1 f
```
along with some laws that canonicity is preserved, like:
```haskell
liftEq (==) = (==)
```

and likewise for `*2` classes:
```haskell
(forall a. Eq a => Eq1 (f a)) => Eq2 f
```
and laws:
```haskell
liftEq2 (==) = liftEq1
```

The `*1` classes also have default methods using the `*2` classes where
possible.

What this means, as explained in the docs, is that `*1` classes really
are generations of the regular classes, indicating that the methods can
be split into a canonical lifting combined with a canonical inner, with
the super class "witnessing" the laws[1] in a fashion.

Circling back to the pragmatics of migrating, note that the superclass
means evidence for the old `Sum`, `Product`, and `Compose` instances is
(more than) sufficient, so breakage is less likely --- as long no
instances are "missing", existing polymorphic code will continue to
work.

Breakage can occur when a datatype implements the `*1` class but not the
corresponding regular class, but this is almost certainly an oversight.
For example, containers made that mistake for `Tree` and `Ord`, which I
fixed in https://github.com/haskell/containers/pull/761, but fixing the
issue by adding `Ord1` was extremely *un*controversial.

`Generically1` was also missing `Eq`, `Ord`, `Read,` and `Show`
instances. It is unlikely this would have been caught without
implementing this change.

-----

[1]: In fact, someday, when the laws are part of the language and not
only documentation, we might be able to drop the superclass field of the
dictionary by using the laws to recover the superclass in an
instance-agnostic manner, e.g. with a *non*-overloaded function with
type:

```haskell
DictEq1 f -> DictEq a -> DictEq (f a)
```

But I don't wish to get into optomizations now, just demonstrate the
close relationship between the law and the superclass.

Bump haddock submodule because of test output changing.
</pre>
</li>
</ul>
<h4 style="margin-top: 10px; margin-bottom: 10px;">30 changed files:</h4>
<ul>
<li class="file-stats">
<a href="#76664ab267df4fc0bec2465efd78bf0afacfe3a7" style="color: #1068bf;">
compiler/GHC/CmmToC.hs
</a>
</li>
<li class="file-stats">
<a href="#75bfcd03f3ba9315d33104fcb0424c6bfeb4e334" style="color: #1068bf;">
compiler/GHC/Hs/Decls.hs
</a>
</li>
<li class="file-stats">
<a href="#7a1af22e4c32b9aa6ec708d9d3788e1c4db5da9a" style="color: #1068bf;">
compiler/GHC/Hs/Utils.hs
</a>
</li>
<li class="file-stats">
<a href="#ea46b374e004d4416e29a563ee063542f98e48c5" style="color: #1068bf;">
compiler/GHC/HsToCore/Docs.hs
</a>
</li>
<li class="file-stats">
<a href="#cf4176c2d1c1c5ac2d46a9fa5fe02a24bc407c3c" style="color: #1068bf;">
compiler/GHC/HsToCore/Errors/Ppr.hs
</a>
</li>
<li class="file-stats">
<a href="#6eaba7424490cb26d74e0dab0f6fd7bc3537dca7" style="color: #1068bf;">
compiler/GHC/HsToCore/Errors/Types.hs
</a>
</li>
<li class="file-stats">
<a href="#3c19c0be465f9a28d7b69f89c55648080fcc37eb" style="color: #1068bf;">
compiler/GHC/HsToCore/Quote.hs
</a>
</li>
<li class="file-stats">
<a href="#649144a78135a23cabfc90dd83c4aabf448eb6ab" style="color: #1068bf;">
compiler/GHC/Iface/Ext/Ast.hs
</a>
</li>
<li class="file-stats">
<a href="#bf951467d4a9aa443cb109cb4c84a2891945649b" style="color: #1068bf;">
compiler/GHC/Parser.y
</a>
</li>
<li class="file-stats">
<a href="#4769efc0cb06e92bc7562e31984f6d7d91048e51" style="color: #1068bf;">
compiler/GHC/Parser/Errors/Ppr.hs
</a>
</li>
<li class="file-stats">
<a href="#6bd0eb7fd0a01f3d8cf2efe3f1d026d2145cf10b" style="color: #1068bf;">
compiler/GHC/Parser/Errors/Types.hs
</a>
</li>
<li class="file-stats">
<a href="#a1ae0a1be35c859d90b0756920a7198075fb91e1" style="color: #1068bf;">
compiler/GHC/Parser/Lexer.x
</a>
</li>
<li class="file-stats">
<a href="#446cb12ca6cefaf1c6eb79b7db643632744263c7" style="color: #1068bf;">
compiler/GHC/Parser/PostProcess.hs
</a>
</li>
<li class="file-stats">
<a href="#13755bdc5d6c6b4c6f31604eb0da778521355795" style="color: #1068bf;">
compiler/GHC/Parser/PostProcess/Haddock.hs
</a>
</li>
<li class="file-stats">
<a href="#7dd1cd0f6f2164a14c83d9aa564dd32bc30e447a" style="color: #1068bf;">
compiler/GHC/Rename/Module.hs
</a>
</li>
<li class="file-stats">
<a href="#e05ee69330b0f7088f11a5f3567137547489664d" style="color: #1068bf;">
compiler/GHC/Rename/Names.hs
</a>
</li>
<li class="file-stats">
<a href="#939d24c1002dc322659c1f67c9f3d2db2ae31dd4" style="color: #1068bf;">
compiler/GHC/Rename/Utils.hs
</a>
</li>
<li class="file-stats">
<a href="#134bd468c04c1bc43429f10f08db3962e9c56a70" style="color: #1068bf;">
compiler/GHC/Tc/Deriv/Functor.hs
</a>
</li>
<li class="file-stats">
<a href="#9d443f31ae0d9b50820b43d5014e8e71ad7dfb02" style="color: #1068bf;">
compiler/GHC/Tc/Deriv/Generics.hs
</a>
</li>
<li class="file-stats">
<a href="#1e112461bfd65ab9492f37fe37931c1d5ddc5c26" style="color: #1068bf;">
compiler/GHC/Tc/Deriv/Infer.hs
</a>
</li>
<li class="file-stats">
<a href="#83d23a46bb6cdc8b1edc16f1fd2c8f5c53e2c9ca" style="color: #1068bf;">
compiler/GHC/Tc/TyCl.hs
</a>
</li>
<li class="file-stats">
<a href="#e63425e031ffe9350ee6b1687e506aaea75d11e1" style="color: #1068bf;">
compiler/GHC/Tc/TyCl/Instance.hs
</a>
</li>
<li class="file-stats">
<a href="#2eac51f9871ca0c0698aa1fc7f79c05ef8fc4a49" style="color: #1068bf;">
compiler/GHC/ThToHs.hs
</a>
</li>
<li class="file-stats">
<a href="#e2c828ee9e003df518a07b05beaa6971e5c62eb0" style="color: #1068bf;">
compiler/GHC/Types/Error/Codes.hs
</a>
</li>
<li class="file-stats">
<a href="#cb4ad425e8ed846dfcc5d3793b08b95f6864e545" style="color: #1068bf;">
compiler/GHC/Utils/Monad.hs
</a>
</li>
<li class="file-stats">
<a href="#997b81d43f8807b1b83ca6cc7c52b367982f2bf7" style="color: #1068bf;">
compiler/Language/Haskell/Syntax/Decls.hs
</a>
</li>
<li class="file-stats">
<a href="#0dceb7a9f77fb10911befcd7e41ece0f0fd3d7a2" style="color: #1068bf;">
libraries/base/Data/Functor/Classes.hs
</a>
</li>
<li class="file-stats">
<a href="#1b3deda2f389b0b871b8f3101d7d70995167c432" style="color: #1068bf;">
libraries/base/Data/Functor/Compose.hs
</a>
</li>
<li class="file-stats">
<a href="#17d5718aa5dd29ff21e1dfcfdb2a57efc392796c" style="color: #1068bf;">
libraries/base/Data/Functor/Product.hs
</a>
</li>
<li class="file-stats">
<a href="#43d6a6cd2dc6f95f29af644c9575eb4ad3356330" style="color: #1068bf;">
libraries/base/Data/Functor/Sum.hs
</a>
</li>
</ul>
<h5 style="margin-top: 10px; margin-bottom: 10px; font-size: 0.875rem;">The diff was not included because it is too large.</h5>

</div>
<div class="footer" style="margin-top: 10px;">
<p style="font-size: small; color: #666;">

<br>
<a href="https://gitlab.haskell.org/ghc/ghc/-/compare/f53f0f1f8679552007545da4993e42580dcb3212...a9a844fdfcc3aa3eecf36238c0e0a74b550d9482" style="color: #1068bf;">View it on GitLab</a>.
<br>
You're receiving this email because of your account on <a target="_blank" rel="noopener noreferrer" href="https://gitlab.haskell.org" style="color: #1068bf;">gitlab.haskell.org</a>. <a href="https://gitlab.haskell.org/-/profile/notifications" target="_blank" rel="noopener noreferrer" class="mng-notif-link" style="color: #1068bf;">Manage all notifications</a> · <a href="https://gitlab.haskell.org/help" target="_blank" rel="noopener noreferrer" class="help-link" style="color: #1068bf;">Help</a>



</p>
</div>
</body>
</html>