-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Array lengths don't support generic parameters. #43408
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Comments
cc @eddyb -- was this intentional? |
This is a limitation of array length - it can't use any parameters in scope - which also came up during the stabilization of associated consts (cc @withoutboats do we have a common issue to use for this?) and the decision taken was to stabilize associated consts without it. The exact error here comes from the type parameter being resolved, but the |
This example triggers a const-evaluation error instead (try on playpen): fn test<T: ?Sized>() {
[0u8; std::mem::size_of::<&T>()];
} cc @GuillaumeGomez @oli-obk Why is the const-eval error printing broken still 😢? |
This makes me sad, as it's the one thing I wanted to do with #42859 😢 |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
I think we shoud change the error message, this is very confusing now. |
@ExpHP The problem is using type parameters (e.g. your @juchiast The error message is "emergent" from the same reason we can't "just" allow this to work right now, the the only other solution I can think of is checking if type-parameters are "really in scope" but that would probably break existing code that doesn't need to look at type parameters. |
#![feature(const_fn)]
pub const fn sof<T:?Sized>() -> usize {
10
}
fn to_byte_array<T>() -> [u8; sof::<T>()] {
panic!()
} Trying this way results in compiler crash in nightly.
Any workarounds known? |
@MageSlayer Nope, it just can't be supported yet, see #43408 (comment) and previous. |
Triage: The current output of #43408 (comment) with the latest nightly:
And with
It's no longer ICE but rejected by |
This now appear to work-ish, but is a bit awkward to use: #![feature(generic_const_exprs)]
unsafe fn zeroed<T: Sized>() -> T
where
[(); std::mem::size_of::<T>()]:
{
// First create an array that has the same size as T, initialized at 0
let x = [0u8; std::mem::size_of::<T>()];
// Then, transmute it to type T, and return it
std::mem::transmute_copy(&x)
} Two things of note:
|
This comment has been minimized.
This comment has been minimized.
@ExpHP I believe this is wrong, and my implementation is safe even if
(Emphasis mine) I believe this means that it is correct even when &U (our output type) has a "stricter alignment" (higher alignment) than |
@roblabla is right, The docs for |
This comment was marked as duplicate.
This comment was marked as duplicate.
This comment was marked as duplicate.
This comment was marked as duplicate.
@rustbot label -I-ICE |
Current Rust 1.45.2 doesn't support this. So need to wait until Rust is improved. rust-lang/rust#43408
EDIT: This can now be made to work on nightly compilers, although it's a bit awkward to use. See this comment.
It would seem that when using size_of in const fn context, it fails to properly compute the size of generic types.
The following function fails
The error is the following :
This is very confusing because it complains that
T
doesn't havestd::marker::Sized
, even though it does have that bound.Meta
rustc_version : rustc 1.20.0-nightly (ae98ebf 2017-07-20)
The text was updated successfully, but these errors were encountered: