<div dir="ltr"><div>Hi Ghc-Devs,</div><div><br></div><div>I believe I've mostly finished the implementation of GHC proposal 0415 [1], the OPAQUE pragma, over at: <a href="https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5562">https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5562</a></div><div><br></div><div>The only remaining issue is that I'm unsure whether there's a way to prevent reboxing of worker arguments as witnessed here: <a href="https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5562/diffs#29ad02619a9f318d67c6cd19648917dbb17354e9_0_134">https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5562/diffs#29ad02619a9f318d67c6cd19648917dbb17354e9_0_134</a></div><div><br></div><div>Note that the reboxing doesn't happen in the worker of the OPAQUE-annotated bindings, because OPAQUE-annotated bindings aren't W/W-transformed, but in a worker of a function that calls the OPAQUE-annotated binding.<br></div><div>This reboxing was the reason behind the descision to W/W transform NOINLINE-annotated bindings in: <a href="https://gitlab.haskell.org/ghc/ghc/-/commit/b572aadb20c2e41e2f6d7b48401bd0b4239ce9f8">https://gitlab.haskell.org/ghc/ghc/-/commit/b572aadb20c2e41e2f6d7b48401bd0b4239ce9f8</a></div><div><br></div><div>But the whole idea behind OPAQUE is not to change calls to the annotated binding f by some call of a name-mangled version of f; so W/W transforming OPAQUE-annoted binders is not an option.<br></div><div><br></div><div>Any hints on how to avoid the reboxing (if possible) would be appreciated, like:</div><div>* Do I need to change something in GHC.Core.Opt.WorkWrap? or</div><div>* Do I need to change the demand/strictness signature of OPAQUE-annoted bindings?</div><div>* or something else?</div><div><br></div><div>Thanks,</div><div><br></div><div>Christiaan<br></div><div><br></div><div>[1] <a href="https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0415-opaque-pragma.rst">https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0415-opaque-pragma.rst</a></div></div>