Skip to content

CBV-convention for dataToTag#

Ticket #21497 (closed) proposes marking some functions as CBV-Ids. A caller of a function marked as CBV-Id is responsible to pass all strict arguments in an evaluated, properly-tagged form.

During a call, Simon suggested that dataToTag# could use the same machinery. dataToTag# is very similar to a strict datacon worker: it needs an evaluated argument.

In the past, we had a wrapper

getTag !x = dataToTag# x

in GHC.Exts, which made sure that dataToTag# receives an evaluated argument. However, as shown in #15696 (closed) (ac977688), this was not enough and dataToTag# now evaluates its argument directly. With the notion of CBV-Id from #21497 (closed), we could rollback this change and make dataToTag# less magical.

To implement this, we'd have to add a wrapper around the primop. We could reuse getTag in GHC.Exts as it was done in the past, or combine the change with #20532 (closed) which adds a typeclass for validity checking. In that case, the wrapping code would be created in the constraint solver.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information