Module proc_macro::bridge::selfless_reify
source · 🔬This is a nightly-only experimental API. (
proc_macro_internals
#27812)Expand description
Abstraction for creating fn
pointers from any callable that effectively
has the equivalent of implementing Default
, even if the compiler neither
provides Default
nor allows reifying closures (i.e. creating fn
pointers)
other than those with absolutely no captures.
More specifically, for a closure-like type to be “effectively Default
”:
- it must be a ZST (zero-sized type): no information contained within, so
that
Default
’s return value (if it were implemented) is unambiguous - it must be
Copy
: no captured “unique ZST tokens” or any other similar types that would make duplicating values at will unsound- combined with the ZST requirement, this confers a kind of “telecopy”
ability: similar to
Copy
, but without keeping the value around, and instead “reconstructing” it (a noop given it’s a ZST) when needed
- combined with the ZST requirement, this confers a kind of “telecopy”
ability: similar to
- it must be provably inhabited: no captured uninhabited types or any
other types that cannot be constructed by the user of this abstraction
- the proof is a value of the closure-like type itself, in a sense the
“seed” for the “telecopy” process made possible by ZST +
Copy
- this requirement is the only reason an abstraction limited to a specific
usecase is required: ZST +
Copy
can be checked with at worst a panic at the “attempted::default()
call” time, but that doesn’t guarantee that the value can be soundly created, and attempting to use the typical “proof ZST token” approach leads yet again to having a ZST +Copy
type that is not proof of anything without a value (i.e. isomorphic to a newtype of the type it’s trying to prove the inhabitation of)
- the proof is a value of the closure-like type itself, in a sense the
“seed” for the “telecopy” process made possible by ZST +
A more flexible (and safer) solution to the general problem could exist once
const
-generic parameters can have type parameters in their types:
Macros
Functions
- _reify_to_extern_c_fn_unaryExperimental
- reify_to_extern_c_fn_hrt_bridgeExperimental