forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
224 additions
and
26 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
25 changes: 25 additions & 0 deletions
25
tests/ui/coherence/occurs-check/associated-type.next.stderr
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,25 @@ | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, RePlaceholder(!2_BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, RePlaceholder(!2_BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, RePlaceholder(!2_BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, RePlaceholder(!2_BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), ())>` for type `for<'a> fn(&'a (), ())` | ||
--> $DIR/associated-type.rs:31:1 | ||
| | ||
LL | impl<T> Overlap<T> for T { | ||
| ------------------------ first implementation here | ||
... | ||
LL | / impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T | ||
LL | | | ||
LL | | where | ||
LL | | for<'a> *const T: ToUnit<'a>, | ||
| |_________________________________^ conflicting implementation for `for<'a> fn(&'a (), ())` | ||
| | ||
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0119`. |
25 changes: 25 additions & 0 deletions
25
tests/ui/coherence/occurs-check/associated-type.old.stderr
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,25 @@ | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, RePlaceholder(!3_BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, RePlaceholder(!3_BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, RePlaceholder(!3_BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Projection, AliasTy { args: [*const ?1t, RePlaceholder(!3_BoundRegion { var: 0, kind: BrNamed(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), 'a) })], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit) }) | ||
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), _)>` for type `for<'a> fn(&'a (), _)` | ||
--> $DIR/associated-type.rs:31:1 | ||
| | ||
LL | impl<T> Overlap<T> for T { | ||
| ------------------------ first implementation here | ||
... | ||
LL | / impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T | ||
LL | | | ||
LL | | where | ||
LL | | for<'a> *const T: ToUnit<'a>, | ||
| |_________________________________^ conflicting implementation for `for<'a> fn(&'a (), _)` | ||
| | ||
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0119`. |
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,45 @@ | ||
// revisions: old next | ||
//[next] compile-flags: -Ztrait-solver=next | ||
|
||
// A regression test for #105787 | ||
|
||
// Using the higher ranked projection hack to prevent us from replacing the projection | ||
// with an inference variable. | ||
trait ToUnit<'a> { | ||
type Unit; | ||
} | ||
|
||
struct LocalTy; | ||
impl<'a> ToUnit<'a> for *const LocalTy { | ||
type Unit = (); | ||
} | ||
|
||
impl<'a, T: Copy + ?Sized> ToUnit<'a> for *const T { | ||
type Unit = (); | ||
} | ||
|
||
trait Overlap<T> { | ||
type Assoc; | ||
} | ||
|
||
type Assoc<'a, T> = <*const T as ToUnit<'a>>::Unit; | ||
|
||
impl<T> Overlap<T> for T { | ||
type Assoc = usize; | ||
} | ||
|
||
impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T | ||
//~^ ERROR conflicting implementations of trait | ||
where | ||
for<'a> *const T: ToUnit<'a>, | ||
{ | ||
type Assoc = Box<usize>; | ||
} | ||
|
||
fn foo<T: Overlap<U>, U>(x: T::Assoc) -> T::Assoc { | ||
x | ||
} | ||
|
||
fn main() { | ||
foo::<for<'a> fn(&'a (), ()), for<'a> fn(&'a (), ())>(3usize); | ||
} |
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,12 @@ | ||
error[E0119]: conflicting implementations of trait `Trait<Alias<_>>` for type `Alias<_>` | ||
--> $DIR/opaques.rs:29:1 | ||
| | ||
LL | impl<T> Trait<T> for T { | ||
| ---------------------- first implementation here | ||
... | ||
LL | impl<T> Trait<T> for defining_scope::Alias<T> { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Alias<_>` | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0119`. |
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,37 @@ | ||
//revisions: old next | ||
//[next] compile-flags: -Ztrait-solver=next | ||
|
||
// A regression test for #105787 | ||
|
||
//[old] known-bug: #105787 | ||
//[old] check-pass | ||
#![feature(type_alias_impl_trait)] | ||
mod defining_scope { | ||
use super::*; | ||
pub type Alias<T> = impl Sized; | ||
|
||
pub fn cast<T>(x: Container<Alias<T>, T>) -> Container<T, T> { | ||
x | ||
} | ||
} | ||
|
||
struct Container<T: Trait<U>, U> { | ||
x: <T as Trait<U>>::Assoc, | ||
} | ||
|
||
trait Trait<T> { | ||
type Assoc; | ||
} | ||
|
||
impl<T> Trait<T> for T { | ||
type Assoc = Box<u32>; | ||
} | ||
impl<T> Trait<T> for defining_scope::Alias<T> { | ||
//[next]~^ ERROR conflicting implementations of trait | ||
type Assoc = usize; | ||
} | ||
|
||
fn main() { | ||
let x: Box<u32> = defining_scope::cast::<()>(Container { x: 0 }).x; | ||
println!("{}", *x); | ||
} |
9 changes: 9 additions & 0 deletions
9
tests/ui/traits/new-solver/generalize/occurs-check-nested-alias.next.stderr
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,9 @@ | ||
error[E0271]: type mismatch resolving `<<T as Id<_>>::Id as Unnormalizable>::Assoc == _` | ||
--> $DIR/occurs-check-nested-alias.rs:31:9 | ||
| | ||
LL | x = y; | ||
| ^ types differ | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0271`. |
37 changes: 37 additions & 0 deletions
37
tests/ui/traits/new-solver/generalize/occurs-check-nested-alias.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 |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// revisions: old next | ||
//[old] check-pass | ||
|
||
// Need to emit an alias-relate instead of a `Projection` goal here. | ||
//[next] compile-flags: -Ztrait-solver=next | ||
//[next] known-bug: trait-system-refactor-initiative#8 | ||
#![crate_type = "lib"] | ||
#![allow(unused)] | ||
trait Unnormalizable { | ||
type Assoc; | ||
} | ||
|
||
trait Id<T> { | ||
type Id; | ||
} | ||
impl<T, U> Id<T> for U { | ||
type Id = U; | ||
} | ||
|
||
struct Inv<T>(*mut T); | ||
|
||
fn unconstrained<T>() -> T { | ||
todo!() | ||
} | ||
|
||
fn create<T, U: Unnormalizable>( | ||
x: &U, | ||
) -> (Inv<T>, Inv<<<U as Id<T>>::Id as Unnormalizable>::Assoc>) { | ||
todo!() | ||
} | ||
|
||
fn foo<T: Unnormalizable>() { | ||
let q = unconstrained(); | ||
let (mut x, y) = create::<_, _>(&q); | ||
x = y; | ||
drop::<T>(q); | ||
} |