-
Notifications
You must be signed in to change notification settings - Fork 13.4k
use cfg_select!
to select the right VaListImpl
definition
#141361
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
#[repr(transparent)] | ||
#[derive(Debug)] | ||
pub struct VaList<'a, 'f: 'a> { | ||
inner: VaListImpl<'f>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm confused by this implementation that is used when we don't know the layout of va_list
(the _ => { ... }
case in the cfg_match!
above). It is inconsistent with the others.
Could we not have &'a mut VaListImpl<'f>
here like above, and make the VaListImpl
a ZST containing just the invariance marker?
Is that fallback implementation even meaningful?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok no, after reading a bit more there are just two approaches
va_list
is just an opaque pointer (probably just the next variadic argument on the stack, though it's opaque so we can't know)va_list
is some sort of struct. It looks like this is used when registers are also at play for passing variadic arguments
These two approaches are captured by the two different ways of representing VaList
. I added a comment with some of that information, in particular #56599 had some useful info.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That does raise the question: what is VaList
for? it has no methods of its own, so I don't see its purpose.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
VaList
is supposed to be ABI compatible with C's va_list
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I was confused by the C definition, until I rediscovered that nasty thing where sizeof
in C is not the same as size_of
in rust: for arrays, sizeof
gives the length of the array, though it is really used/passed as a pointer type.
Anyway, #44930 (comment) has an updated design for this api, which keeps VaListImpl
private.
blocked on #137198 for now, which renames edit: that was merged, we're good to go here. |
bd701c8
to
4c3ea27
Compare
cfg_match!
to select the right VaListImpl
definitioncfg_select!
to select the right VaListImpl
definition
I don't see any reason not to use the new marker types when appropriate. That's what they're there for, after all. |
tracking issue: #44930
Just a bit of cleanup really.
We could use
PhantomInvariantLifetime<'f>
(#135806) to make it more precise what thatPhantomData<&'f mut &'f c_void>
marker is doing. I'm not sure how ready that feature is though, @jhpratt are these types good to use internally?Some research into the lifetimes of
VaList
andVaListImpl
:It's easy to see why the lifetime of these types should not be extended, a
VaList
orVaListImpl
escaping its function is a bad idea. I don't currently see why coercing the lifetime to a shorter lifetime is problematic though, but probably I just don't understand variance well enough to see it. The history does not provide much explanation:VaListImpl<'f>
, but it is only covariant in'f
VaListImpl<'f>
invariant over'f
(becauseVaList<'a, 'f>
is already invariant over'f
, but I think that is just an implementation detail?)Beyond that I don't see how the lifetime situation can be simplified significantly, e.g. this function really needs
'copy
to be unconstrained.@rustbot label +F-c_variadic
r? @workingjubilee