Open
Description
#![feature(discriminant_kind)]
use std::marker::DiscriminantKind;
fn trait_bound<T: DiscriminantKind>() {}
fn normalize<T: DiscriminantKind<Discriminant = u8>>() {}
fn foo<'a, 'b>()
where
&'b (): DiscriminantKind<Discriminant = u8>,
{
trait_bound::<&'a ()>();
}
fn bar<'a, 'b>()
where
&'b (): DiscriminantKind<Discriminant = u8>,
{
normalize::<&'a ()>();
}
foo
compiles, bar
does not:
error: lifetime may not live long enough
--> src/lib.rs:18:5
|
14 | fn bar<'a, 'b>()
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
...
18 | normalize::<&'a ()>();
| ^^^^^^^^^^^^^^^^^^^ requires that `'b` must outlive `'a`
|
= help: consider adding the following bound: `'b: 'a`
error: lifetime may not live long enough
--> src/lib.rs:18:5
|
14 | fn bar<'a, 'b>()
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
...
18 | normalize::<&'a ()>();
| ^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'b`
|
= help: consider adding the following bound: `'a: 'b`
help: `'b` and `'a` must be the same: replace one with the other
Candidate selection for the trait goal prefers the trivial builtin impl. Normalization instead prefers the where-bound. This is inconsistent and means that whether we use the associated items impacts whether a trait bound holds.
It impacts all trivial builtin traits with associated types, I don't think this effects stable rn as either the trait is unstable or the builtin impls only exist for unnameable types. Nominating for t-types vibeck
Metadata
Metadata
Assignees
Labels
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
lcnr commentedon Nov 14, 2024
I realize this also affects our preference of impls over global where-bounds:
[-]normalization does not prefer trivial builtin impls over where-bounds[/-][+]candidate selection for normalization and trait goals disagree[/+]lcnr commentedon Nov 26, 2024
we also have the same issue with alias-bound/where-bound mismatch
lcnr commentedon Nov 26, 2024
Auto merge of rust-lang#138176 - compiler-errors:rigid-sized-obl, r=<…
2 remaining items