Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign upUnsafeUnion type #371
Comments
This comment has been minimized.
This comment has been minimized.
|
re the last point - we have been moving in the direction of leaving layouts undefined and requiring an annotation to get a specific (C-compatible) layout, which I think is a good thing. I would recommend the same here. |
This comment has been minimized.
This comment has been minimized.
|
I agree with that in general, but in this particular case, where would you put the annotation? This is a type, not a language construct -- seems like that would require separate (The minimum size/alignment are dictated by size and alignment constraints of the contained types - and I guess you could make it even larger or more loosely aligned, but why?) |
This comment has been minimized.
This comment has been minimized.
|
As in the other RFC, this should be possible in Rust without special cases in the compiler. Instead of making one RFC per type, one should try to find out what features are necessary to implement this in a library. |
This comment has been minimized.
This comment has been minimized.
|
Triage: fixed by #1444 |
glaebhoerl commentedOct 8, 2014
Splicing in my comment from a related RFC:
UnsafeUnion<A, B>.unions in C: a type compatible with the size and alignment of bothAandB. So sizeof(UnsafeUnion<A, B>) = max(sizeof(A), sizeof(B)), and alignof(UnsafeUnion<A, B>) = lcm(alignof(A), alignof(B)).transmute(). Sotransmute::<A, UnsafeUnion<A, B>>,transmute::<B, UnsafeUnion<A, B>>,transmute::<UnsafeUnion<A, B>, A>, andtransmute::<UnsafeUnion<A, B>, B>all have well-defined behavior, in basically the same circumstances as in C. (This means that the input and output oftransmutewould not have the same size/alignment in these cases. I don't know whether this is an issue, provided that they are both known.)transmutes of pointers/references, on the other hand, should only be valid in one direction: e.g. you can legallytransmute&UnsafeUnion<A, B>to&A, but not vice versa.UnsafeUnions is idempotent: repr(UnsafeUnion<A, A>) = repr(A), commutative: repr(UnsafeUnion<A, B>) = repr(UnsafeUnion<B, A>), and associative: repr(UnsafeUnion<A, UnsafeUnion<B, C>>) = repr(UnsafeUnion<UnsafeUnion<A, B>, C>), larger unions can simply be composed from the binary one. The use oftransmutefor {,de}construction is also completely impervious to this nesting. We could then also potentially provide synonyms liketype UnsafeUnion3<A, B, C> = UnsafeUnion<A, UnsafeUnion<B, C>>for convenience.This would primarily be for (a) unsafe code and (b) interfacing with C.