<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"><base href="x-msg://1060/"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>It seemed clear to me that Ptr *should* be representational, thinking that we don't want to coerce a `Ptr Int` to a `Ptr Bool`. I don't see any reason why this couldn't be changed.</div><div><br></div><div>Why is Ptr a `data` not a `newtype`? If it were a newtype, we could keep the role annotation and use `coerce` internally, according to the updated Coercible solver.</div><div><br></div><div>However, it is crucial that FunPtr have a representational argument, as normaliseFfiType' depends on this fact. There is a brief comment in TcForeign, but clearly more comments are necessary. Will do shortly. If we want to change FunPtr's role, normaliseFfiType' would have to be updated, too, but it shouldn't be hard.</div><div><br></div><div>More comments in the code later today.</div><div><br></div><div>Richard</div><br><div><div>On Jun 3, 2014, at 7:13 AM, Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div lang="EN-GB" link="#0563C1" vlink="#954F72" style="font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div class="WordSection1" style="page: WordSection1; "><p class="MsoNormal" style="margin: 6pt 0cm; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 12pt; ">Richard<o:p></o:p></span></p><p class="MsoNormal" style="margin: 6pt 0cm; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 12pt; ">In GHC.Ptr we see<o:p></o:p></span></p><div style="margin: 0cm 0cm 0.0001pt 36pt; font-size: 12pt; font-family: 'Courier New'; ">type role Ptr representational<o:p></o:p></div><div style="margin: 0cm 0cm 0.0001pt 36pt; font-size: 12pt; font-family: 'Courier New'; ">data Ptr a = Ptr Addr# deriving (Eq, Ord)<o:p></o:p></div><p class="MsoNormal" style="margin: 6pt 0cm; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 12pt; ">with no comments.  Why is Ptr representational?<o:p></o:p></span></p><p class="MsoNormal" style="margin: 6pt 0cm; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 12pt; ">In the same module we have castPtr, which unpacks and repacks a Ptr.  If Ptr was phantom, we could use coerce.  And that in turn would actually make a lot of code more efficient  there are lots of calls to castPtr.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 6pt 0cm; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 12pt; ">Simon<o:p></o:p></span></p><p class="MsoNormal" style="margin: 6pt 0cm; font-size: 11pt; font-family: Calibri, sans-serif; "><span style="font-size: 12pt; "> </span></p></div></div></blockquote></div><br></body></html>