<div dir="auto">Currently, we have<div dir="auto"><br></div><div dir="auto">data Ptr a = Ptr Addr#</div><div dir="auto">type role Ptr phantom</div><div dir="auto"><br></div><div dir="auto">This is weird: accidentally coercing a pointer to a different type is very bad. The only reason Ptr has this role is that without it, castPtr and such may not be free or will involve unsafe coercions.</div><div dir="auto"><br></div><div dir="auto">Thankfully, we have enough power to fix this now.</div><div dir="auto"><br></div><div dir="auto">    data Addr = Ptr_ Addr#</div><div dir="auto"><br></div><div dir="auto">    newtype Ptr a = Ptr_ Addr</div><div dir="auto">    type role Ptr nominal</div><div dir="auto"><br></div><div dir="auto">    pattern Ptr :: Addr# -> Ptr a</div><div dir="auto">    pattern Ptr a# = Ptr_ (Addr a#)</div><div dir="auto"><br></div><div dir="auto"><span style="font-family:sans-serif">    castPtr :: Ptr a -> Ptr b</span><br></div><div dir="auto"><span style="font-family:sans-serif">    castPtr (Ptr a) = Ptr a</span></div><div dir="auto"><br></div><div dir="auto">    ptrCoercible</div><div dir="auto">      :: ((forall a b. Coercible (Ptr a) (Ptr b)) => r)</div><div dir="auto">      -> r</div><div dir="auto">    ptrCoercible r = r</div><div dir="auto"><br></div><div dir="auto">    ptrCoercion :: Coercion (Ptr a) (Ptr b)</div><div dir="auto">    ptrCoercion = Coercion</div><div dir="auto"><br></div><div dir="auto">I propose that we do this.</div></div>