forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
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#67059 - TommasoBianchi:dropck_fix_pr, r=pnk…
…felix Fix too restrictive checks on Drop impls Fixes rust-lang#34426. Fixes rust-lang#58311. This PR completes and extends rust-lang#59497 (which has been inactive for a while now). The problem generating both issues was that when checking that the `Predicate`s of the `Drop` impl are exactly the same as the ones of the struct definition, the check was essentially performed by a simple `==` operator, which was not handling correctly HRTBs and involved `Fn` types. The implemented solution relies on the `relate` machinery to more correctly equate `Predicate`s, and on `anonymize_late_bound_regions` to handle HRTB in a more general way. As the `Relate` trait currently is implemented only for `TraitPredicate` and `ProjectionPredicate` (and as they were the ones generating problems), `relate` is used only for them while for other `Predicate`s the equality check is kept. I'm currently considering whether it would make sense to implement the `Relate` trait also for all other `Predicate`s to render the proposed solution more general.
- Loading branch information
Showing
3 changed files
with
227 additions
and
17 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// run-pass | ||
//! Regression test for #58311, regarding the usage of Fn types in drop impls | ||
|
||
// All of this Drop impls should compile. | ||
|
||
#[allow(dead_code)] | ||
struct S<F: Fn() -> [u8; 1]>(F); | ||
|
||
impl<F: Fn() -> [u8; 1]> Drop for S<F> { | ||
fn drop(&mut self) {} | ||
} | ||
|
||
#[allow(dead_code)] | ||
struct P<A, F: FnOnce() -> [A; 10]>(F); | ||
|
||
impl<A, F: FnOnce() -> [A; 10]> Drop for P<A, F> { | ||
fn drop(&mut self) {} | ||
} | ||
|
||
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 |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// run-pass | ||
//! Regression test for #34426, regarding HRTB in drop impls | ||
|
||
// All of this Drop impls should compile. | ||
|
||
pub trait Lifetime<'a> {} | ||
impl<'a> Lifetime<'a> for i32 {} | ||
|
||
#[allow(dead_code)] | ||
struct Foo<L> | ||
where | ||
for<'a> L: Lifetime<'a>, | ||
{ | ||
l: L, | ||
} | ||
|
||
impl<L> Drop for Foo<L> | ||
where | ||
for<'a> L: Lifetime<'a>, | ||
{ | ||
fn drop(&mut self) {} | ||
} | ||
|
||
#[allow(dead_code)] | ||
struct Foo2<L> | ||
where | ||
for<'a> L: Lifetime<'a>, | ||
{ | ||
l: L, | ||
} | ||
|
||
impl<T: for<'a> Lifetime<'a>> Drop for Foo2<T> | ||
where | ||
for<'x> T: Lifetime<'x>, | ||
{ | ||
fn drop(&mut self) {} | ||
} | ||
|
||
pub trait Lifetime2<'a, 'b> {} | ||
impl<'a, 'b> Lifetime2<'a, 'b> for i32 {} | ||
|
||
#[allow(dead_code)] | ||
struct Bar<L> | ||
where | ||
for<'a, 'b> L: Lifetime2<'a, 'b>, | ||
{ | ||
l: L, | ||
} | ||
|
||
impl<L> Drop for Bar<L> | ||
where | ||
for<'a, 'b> L: Lifetime2<'a, 'b>, | ||
{ | ||
fn drop(&mut self) {} | ||
} | ||
|
||
#[allow(dead_code)] | ||
struct FnHolder<T: for<'a> Fn(&'a T, dyn for<'b> Lifetime2<'a, 'b>) -> u8>(T); | ||
|
||
impl<T: for<'a> Fn(&'a T, dyn for<'b> Lifetime2<'a, 'b>) -> u8> Drop for FnHolder<T> { | ||
fn drop(&mut self) {} | ||
} | ||
|
||
fn main() { | ||
let _foo = Foo { l: 0 }; | ||
|
||
let _bar = Bar { l: 0 }; | ||
} |