forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 6
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#118146 - compiler-errors:deref-into-dyn-regions, r=lcnr Rework supertrait lint once again I accidentally pushed the wrong commits because I totally didn't check I was on the right computer when updating rust-lang#118026. Sorry, this should address all the nits in rust-lang#118026. r? lcnr
- Loading branch information
Showing
10 changed files
with
125 additions
and
25 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
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 @@ | ||
// check-pass | ||
|
||
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 { | ||
//~^ WARN this `Deref` implementation is covered by an implicit supertrait coercion | ||
type Target = dyn Bar<u32> + 'a; | ||
|
||
fn deref(&self) -> &Self::Target { | ||
self.as_dyn_bar_u32() | ||
} | ||
} | ||
|
||
fn main() {} |
14 changes: 14 additions & 0 deletions
14
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,14 @@ | ||
warning: this `Deref` implementation is covered by an implicit supertrait coercion | ||
--> $DIR/migrate-lint-different-substs.rs:11:1 | ||
| | ||
LL | impl<'a> Deref for dyn Foo + 'a { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `dyn Foo` implements `Deref<Target = dyn Bar<u32>>` which conflicts with supertrait `Bar<i32>` | ||
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: `#[warn(deref_into_dyn_supertrait)]` on by default | ||
|
||
warning: 1 warning emitted | ||
|