-
Notifications
You must be signed in to change notification settings - Fork 13.8k
Open
Labels
A-inferenceArea: Type inferenceArea: Type inferenceC-bugCategory: This is a bug.Category: This is a bug.F-generic_const_exprs`#![feature(generic_const_exprs)]``#![feature(generic_const_exprs)]`P-lowLow priorityLow priorityT-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.requires-incomplete-featuresThis issue requires the use of incomplete features.This issue requires the use of incomplete features.
Description
I tried this code:
#![expect(incomplete_features, reason = "generic_const_exprs")]
#![feature(generic_const_exprs)]
pub fn compute_root_only<const N: u64>() -> u64
where
[(); N.ilog2() as usize]:,
{
N
}
#[test]
fn test() {
test_impl::<99>();
}
#[cfg(test)]
fn test_impl<const N: u64>()
where
[(); N.ilog2() as usize]:,
{
// Const generic is inferred, but it shouldn't be!
assert_eq!(compute_root_only(), N);
}
I expected to see this happen:
error[E0284]: type annotations needed
--> src/lib.rs:22:16
|
22 | assert_eq!(compute_root_only(), N);
| ^^^^^^^^^^^^^^^^^ cannot infer the value of the const parameter `N` declared on the function `compute_root_only`
|
note: required by a const generic parameter in `compute_root_only`
--> src/lib.rs:4:26
|
4 | pub fn compute_root_only<const N: u64>() -> u64
| ^^^^^^^^^^^^ required by this const generic parameter in `compute_root_only`
help: consider specifying the generic argument
|
22 | assert_eq!(compute_root_only::<N>(), N);
| +++++
Instead, this happened: It compiles successfully 🤯
The key thing is where
bound. If it is simplified to something simpler like this:
where
[(); N]:,
Then I do get expected compiler error.
This is basically a miscompilation, compiler should not pick arbitrary matching where bound from the context of the caller to infer types of the called function unless corresponding constant is used explicitly.
Meta
rustc --version --verbose
:
rustc 1.89.0-nightly (cdd545be1 2025-06-07)
binary: rustc
commit-hash: cdd545be1b4f024d38360aa9f000dcb782fbc81b
commit-date: 2025-06-07
host: x86_64-unknown-linux-gnu
release: 1.89.0-nightly
LLVM version: 20.1.5
Metadata
Metadata
Assignees
Labels
A-inferenceArea: Type inferenceArea: Type inferenceC-bugCategory: This is a bug.Category: This is a bug.F-generic_const_exprs`#![feature(generic_const_exprs)]``#![feature(generic_const_exprs)]`P-lowLow priorityLow priorityT-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.requires-incomplete-featuresThis issue requires the use of incomplete features.This issue requires the use of incomplete features.
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
workingjubilee commentedon Jun 11, 2025
... sorry, trying to understand this report. Isn't the inference correct?
nazar-pc commentedon Jun 11, 2025
It is correct here, but I didn't specify the value of
const N
forcompute_root_only()
and this is a completely arbitrary guess, there is no direct connection between two functions.This is the first ever instance where I see a behavior like this. If this was intentional, I would have expected for
[(); N]:,
to have the same effect and from there probably non-const generics to be inferred the same way too, but none of that is actually the case except for this interesting special case.fmease commentedon Jun 11, 2025
Smaller:
Reproduces when the where-clauses match 100% and if the const parameter is involved "non-trivially" (
N
would be "trivial";N as _
/std::convert::identity(N)
would be "non-trivial" ((N)
crashes but that's been reported already)).