Skip to content
  • Simon Peyton Jones's avatar
    Fix bogus worker for newtypes · ff47e60a
    Simon Peyton Jones authored
    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 #16191 is indeed a dup of #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.
    
    (cherry picked from commit a5373c1f)
    ff47e60a