forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#119385 - fmease:assoc-const-eq-fixes-2, r=o…
…li-obk,cjgillot Fix type resolution of associated const equality bounds (take 2) Instead of trying to re-resolve the type of assoc const bindings inside the `type_of` query impl in an incomplete manner, transfer the already (correctly) resolved type from `add_predicates_for_ast_type_binding` to `type_of`/`anon_type_of` through query feeding. --- Together with rust-lang#118668 (merged) and rust-lang#121258, this supersedes rust-lang#118360. Fixes rust-lang#118040. r? ``@ghost``
- Loading branch information
Showing
5 changed files
with
56 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
// Regression test for issue #118040. | ||
// Ensure that we support assoc const eq bounds where the assoc const comes from a supertrait. | ||
|
||
//@ check-pass | ||
|
||
#![feature(associated_const_equality)] | ||
|
||
trait Trait: SuperTrait {} | ||
trait SuperTrait: SuperSuperTrait<i32> {} | ||
trait SuperSuperTrait<T> { | ||
const K: T; | ||
} | ||
|
||
fn take(_: impl Trait<K = 0>) {} | ||
|
||
fn main() {} |
16 changes: 10 additions & 6 deletions
16
tests/ui/associated-consts/assoc-const-eq-ty-alias-noninteracting.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,25 @@ | ||
// Regression test for issue #112560. | ||
// Respect the fact that (associated) types and constants live in different namespaces and | ||
// therefore equality bounds involving identically named associated items don't conflict if | ||
// their kind (type vs. const) differs. | ||
|
||
// FIXME(fmease): Extend this test to cover supertraits again | ||
// once #118040 is fixed. See initial version of PR #118360. | ||
// their kind (type vs. const) differs. This obviously extends to supertraits. | ||
|
||
//@ check-pass | ||
|
||
#![feature(associated_const_equality)] | ||
|
||
trait Trait { | ||
trait Trait: SuperTrait { | ||
type N; | ||
type Q; | ||
|
||
const N: usize; | ||
} | ||
|
||
fn take(_: impl Trait<N = 0, N = ()>) {} | ||
trait SuperTrait { | ||
const Q: &'static str; | ||
} | ||
|
||
fn take0(_: impl Trait<N = 0, N = ()>) {} | ||
|
||
fn take1(_: impl Trait<Q = "...", Q = [()]>) {} | ||
|
||
fn main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,31 @@ | ||
//@ check-pass | ||
|
||
#![feature(generic_const_items, associated_const_equality)] | ||
#![feature(generic_const_items, associated_const_equality, adt_const_params)] | ||
#![allow(incomplete_features)] | ||
|
||
trait Owner { | ||
const C<const N: u32>: u32; | ||
const K<const N: u32>: u32; | ||
const Q<T>: Maybe<T>; | ||
} | ||
|
||
impl Owner for () { | ||
const C<const N: u32>: u32 = N; | ||
const K<const N: u32>: u32 = N + 1; | ||
const Q<T>: Maybe<T> = Maybe::Nothing; | ||
} | ||
|
||
fn take0<const N: u32>(_: impl Owner<C<N> = { N }>) {} | ||
fn take1(_: impl Owner<K<99> = 100>) {} | ||
fn take2(_: impl Owner<Q<()> = { Maybe::Just(()) }>) {} | ||
|
||
fn main() { | ||
take0::<128>(()); | ||
take1(()); | ||
} | ||
|
||
#[derive(PartialEq, Eq, std::marker::ConstParamTy)] | ||
enum Maybe<T> { | ||
Nothing, | ||
Just(T), | ||
} |