Repository navigation
Calling non-const function core::slice::iter::<impl IntoIterator for &[u8]>::into_iter #125490
Copy link
Copy link
Open
Labels
A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)Area: Constant evaluation, covers all const contexts (static, const fn, ...)A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsD-terseDiagnostics: An error or lint that doesn't give enough information about the problem at hand.Diagnostics: An error or lint that doesn't give enough information about the problem at hand.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
Description
I didn't find a clear issue that was talking about that, and I'm clearly in the "nightly scape" of Rust here. I'm trying to build the following code (don't take attention to the possible unsafe part of this code, I omitted voluntary some part for better clarity):
#![feature(const_mut_refs)]
#![feature(const_for)]
#![feature(const_maybe_uninit_write)]
#![feature(effects)]
use core::mem::MaybeUninit;
#[must_use]
const fn from_slice_unchecked(from_slice: &[u8]) -> [MaybeUninit<u8>; 1]
{
let mut vec = [MaybeUninit::uninit(); 1];
for byte in from_slice {
vec[0].write(*byte);
}
vec
}
fn main() {
let _ = const { from_slice_unchecked(&[0]) };
}error[E0080]: evaluation of `main::{constant#0}` failed
--> src/main.rs:13:17
|
13 | for byte in from_slice {
| ^^^^^^^^^^ calling non-const function `core::slice::iter::<impl IntoIterator for &[u8]>::into_iter`
|
note: inside `from_slice_unchecked`
--> src/main.rs:13:17
|
13 | for byte in from_slice {
| ^^^^^^^^^^
note: inside `main::{constant#0}`
--> src/main.rs:21:21
|
21 | let _ = const { from_slice_unchecked(&[0]) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
note: erroneous constant encountered
--> src/main.rs:21:13
|
21 | let _ = const { from_slice_unchecked(&[0]) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
For more information about this error, try `rustc --explain E0080`.It does build if I don't const inline the call to from_slice_unchecked() though. But here, I'm wanted to create this buffer at build time and I don't find a way to do it "easily".
The closer issue I could find is #103265 which contains this closed PR #102225.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)Area: Constant evaluation, covers all const contexts (static, const fn, ...)A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsD-terseDiagnostics: An error or lint that doesn't give enough information about the problem at hand.Diagnostics: An error or lint that doesn't give enough information about the problem at hand.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
Activity
joboet commentedon May 25, 2024
forloops desugar to a call tointo_iter, which is not aconstfunction, and are therefore currently not allowed inconstcontext.It's standard practice to write a
whileloop over the indices instead, even if it is not very idiomatic:(this version actually only uses stable features)
Edit: here is a cool example of the
crccrate using this pattern to generate a lookup-table.workingjubilee commentedon May 27, 2024
The error for this should explain that.
jaudiger commentedon May 27, 2024
@joboet Works perfectly in stable indeed, thanks for pointing me out in this direction. I'm now able to remove in my code the following feature flag:
#![feature(const_for)], but I then encounter new blockers during the road toconst_mut_refs. I'll focus on those new ones.Anyway, thanks for your help. Since the trait IntoIterator is not available in const context, should I leave this issue open or close it if there is a duplicate already somewhere?
PS: thanks for the link, it was a good source of interesting line of code.