diff options
| author | bors <bors@rust-lang.org> | 2023-06-14 16:59:26 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-06-14 16:59:26 +0000 |
| commit | ffe95252bd355fd9643de6dceea997bb7bee229b (patch) | |
| tree | 756321fc3a37b513bb6552c8c0898ecabb81a434 /tests | |
| parent | 1d0d686f108a2b405fa3130c0903023c1afc0eac (diff) | |
| parent | 4795c919399610d9105fae67492d3eb65c0c1c01 (diff) | |
| download | rust-ffe95252bd355fd9643de6dceea997bb7bee229b.tar.gz rust-ffe95252bd355fd9643de6dceea997bb7bee229b.zip | |
Auto merge of #10954 - y21:issue10158, r=llogiq
[`derivable_impls`]: don't lint if `default()` call expr unsize-coerces to trait object
Fixes #10158.
This fixes a FP where the derive-generated Default impl would have different behavior because of unsize coercion from `Box<T>` to `Box<dyn Trait>`:
```rs
struct S {
x: Box<dyn std::fmt::Debug>
}
impl Default for S {
fn default() -> Self {
Self {
x: Box::<()>::default()
// ^~ Box<()> coerces to Box<dyn Debug>
// #[derive(Default)] would call Box::<dyn Debug>::default()
}
}
}
```
(this intentionally only looks for trait objects `dyn` specifically, and not any unsize coercion, e.g. `&[i32; 5]` to `&[i32]`, because that breaks existing tests and isn't actually problematic, as far as I can tell)
changelog: [`derivable_impls`]: don't lint if `default()` call expression unsize-coerces to trait object
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ui/derivable_impls.fixed | 21 | ||||
| -rw-r--r-- | tests/ui/derivable_impls.rs | 21 |
2 files changed, 42 insertions, 0 deletions
diff --git a/tests/ui/derivable_impls.fixed b/tests/ui/derivable_impls.fixed index aa0efb85c29..a10f3d01070 100644 --- a/tests/ui/derivable_impls.fixed +++ b/tests/ui/derivable_impls.fixed @@ -268,4 +268,25 @@ impl Default for OtherGenericType { } } +mod issue10158 { + pub trait T {} + + #[derive(Default)] + pub struct S {} + impl T for S {} + + pub struct Outer { + pub inner: Box<dyn T>, + } + + impl Default for Outer { + fn default() -> Self { + Outer { + // Box::<S>::default() adjusts to Box<dyn T> + inner: Box::<S>::default(), + } + } + } +} + fn main() {} diff --git a/tests/ui/derivable_impls.rs b/tests/ui/derivable_impls.rs index 8dc999ad586..18cef1c5be8 100644 --- a/tests/ui/derivable_impls.rs +++ b/tests/ui/derivable_impls.rs @@ -304,4 +304,25 @@ impl Default for OtherGenericType { } } +mod issue10158 { + pub trait T {} + + #[derive(Default)] + pub struct S {} + impl T for S {} + + pub struct Outer { + pub inner: Box<dyn T>, + } + + impl Default for Outer { + fn default() -> Self { + Outer { + // Box::<S>::default() adjusts to Box<dyn T> + inner: Box::<S>::default(), + } + } + } +} + fn main() {} |
