-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
1 parent
06d1afe
commit aec39b6
Showing
11 changed files
with
134 additions
and
30 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
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
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
34 changes: 34 additions & 0 deletions
34
tests/ui/traits/trait-upcasting/deref-upcast-behavioral-change.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,34 @@ | ||
#![deny(deref_into_dyn_supertrait)] | ||
use std::ops::Deref; | ||
|
||
trait Bar<T> {} | ||
impl<T, U> Bar<U> for T {} | ||
|
||
trait Foo: Bar<i32> { | ||
fn as_dyn_bar_u32<'a>(&self) -> &(dyn Bar<u32> + 'a); | ||
} | ||
|
||
impl Foo for () { | ||
fn as_dyn_bar_u32<'a>(&self) -> &(dyn Bar<u32> + 'a) { | ||
self | ||
} | ||
} | ||
|
||
impl<'a> Deref for dyn Foo + 'a { | ||
type Target = dyn Bar<u32> + 'a; | ||
|
||
fn deref(&self) -> &Self::Target { | ||
self.as_dyn_bar_u32() | ||
} | ||
} | ||
|
||
fn take_dyn<T>(x: &dyn Bar<T>) -> T { | ||
todo!() | ||
} | ||
|
||
fn main() { | ||
let x: &dyn Foo = &(); | ||
let y = take_dyn(x); | ||
let z: u32 = y; | ||
//~^ ERROR mismatched types | ||
} |
16 changes: 16 additions & 0 deletions
16
tests/ui/traits/trait-upcasting/deref-upcast-behavioral-change.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,16 @@ | ||
error[E0308]: mismatched types | ||
--> $DIR/deref-upcast-behavioral-change.rs:32:18 | ||
| | ||
LL | let z: u32 = y; | ||
| --- ^ expected `u32`, found `i32` | ||
| | | ||
| expected due to this | ||
| | ||
help: you can convert an `i32` to a `u32` and panic if the converted value doesn't fit | ||
| | ||
LL | let z: u32 = y.try_into().unwrap(); | ||
| ++++++++++++++++++++ | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0308`. |
20 changes: 20 additions & 0 deletions
20
tests/ui/traits/trait-upcasting/migrate-lint-different-substs.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,20 @@ | ||
#![deny(deref_into_dyn_supertrait)] | ||
|
||
use std::ops::Deref; | ||
|
||
trait Bar<T> {} | ||
|
||
trait Foo: Bar<i32> { | ||
fn as_dyn_bar_u32<'a>(&self) -> &(dyn Bar<u32> + 'a); | ||
} | ||
|
||
impl<'a> Deref for dyn Foo + 'a { | ||
//~^ ERROR `dyn Foo` implements `Deref<Target = dyn Bar<u32>>` which conflicts with supertrait `Bar<i32>` | ||
type Target = dyn Bar<u32> + 'a; | ||
|
||
fn deref(&self) -> &Self::Target { | ||
self.as_dyn_bar_u32() | ||
} | ||
} | ||
|
||
fn main() {} |
18 changes: 18 additions & 0 deletions
18
tests/ui/traits/trait-upcasting/migrate-lint-different-substs.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,18 @@ | ||
error: `dyn Foo` implements `Deref<Target = dyn Bar<u32>>` which conflicts with supertrait `Bar<i32>` | ||
--> $DIR/migrate-lint-different-substs.rs:11:1 | ||
| | ||
LL | impl<'a> Deref for dyn Foo + 'a { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this implementation is shadowed by the trait-upcasting coercion, and may not be reached | ||
LL | | ||
LL | type Target = dyn Bar<u32> + 'a; | ||
| -------------------------------- target type is a supertrait of `dyn Foo` | ||
| | ||
= help: consider removing this implementation or replacing it with a method instead | ||
note: the lint level is defined here | ||
--> $DIR/migrate-lint-different-substs.rs:1:9 | ||
| | ||
LL | #![deny(deref_into_dyn_supertrait)] | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
error: aborting due to previous error | ||
|