Fix bogus worker for newtypes

Authored by simonpj on Jan 16 2019, 10:34 AM.

Description

Fix bogus worker for newtypes

The "worker" for a newtype is actually a function
with a small (compulsory) unfolding, namely a cast.

But the construction of this function was plain wrong
for newtype /instances/; it cast the arguemnt to the
family type rather than the representation type.

This never actually bit us because, in the case of a
family instance, we immediately cast the result to
the family type. So we get

\x. (x |> co1) |> co2

where the compositio of co1 and co2 is ill-kinded.
However the optimiser (even the simple optimiser)
just collapsed those casts, ignoring the mis-match
in the middle, so we never saw the problem.

Trac Trac #16191 is indeed a dup of Trac #16141; but the resaon
these tickets produce Lint errors is not the unnecessary
forcing; it's because of the ill-typed casts.

This patch fixes the ill-typed casts, properly. I can't
see a way to trigger an actual failure prior to this
patch, but it's still wrong wrong wrong to have ill-typed
casts, so better to get rid of them.

Details

Committed
Marge Bot <ben+marge-bot@smart-cactus.org>Jan 22 2019, 2:02 AM
Parents
rGHC64ce6afa21fa: Extend linker-script workaround to work with musl libc
Branches
Unknown
Tags
Unknown