-
Notifications
You must be signed in to change notification settings - Fork 182
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
Add initial zeroslice!
and zerovec!
macros
#3453
Conversation
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.
Nice!
() => ( | ||
$crate::ZeroSlice::new_empty() | ||
); | ||
($aligned:ty; $array_fn:expr; $($x:expr),+ $(,)?) => ( |
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.
thought: add a case without $array_fn
that uses <$aligned as $crate::ule::AsULE>::ULE::from_array
.
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.
Please have a look at #3454
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.
is the type strictly necessary? We could probably make do with using _
if the type is omitted and rely on context
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.
We need the unaligned type to declare the const slice, and the cleanest way to get that is to ask for the aligned type.
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.
To expand on that, the internal const X
is necessary for non-const contexts:
let x: &ZeroSlice<char> = zeroslice![<char as AsULE>::ULE::from_array; 'a'];
println!("{:?}", x); // error: creates a temporary value which is freed while still in use ^
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.
Fortunately or unfortunately, I can get the compiler to extend the lifetime of the inner array (avoiding the need for the temporary) by using transmute
directly instead of calling the ZeroSlice constructor...
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.
Would like @Manishearth's thoughts on if there is some other way we can avoid the type. It's totally something the compiler should be able to infer; I just don't know how in this context
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 don't think that code is sound. You're extending the lifetime of the type, but the temporary array still gets dropped at the end of the expression. In fact if you run Miri you get
error: Undefined Behavior: pointer to alloc8209 was dereferenced after this allocation got freed
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.
Inline const
can solve this in the future. However in the follow up we're using the type to look up the conversion function, and I'd rather specify the type than the function.
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.
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.
So happy to see this coming together
Part of #1935.
This adds the
zeroslice![]
andzerovec![]
macros:A follow-up PR will use this macro in ICU4X where applicable.