diff options
| author | David Tolnay <dtolnay@gmail.com> | 2021-05-20 19:40:48 -0700 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2021-05-20 19:42:29 -0700 |
| commit | c441675edf501c63c892a381fd4842042c3cd663 (patch) | |
| tree | 27c686b928c55b9dc464d651ba85cdb74bdde639 | |
| parent | 40d23020470db06903589e210c83a4936f22d52a (diff) | |
| download | rust-c441675edf501c63c892a381fd4842042c3cd663.tar.gz rust-c441675edf501c63c892a381fd4842042c3cd663.zip | |
Add Weak may_dangle tests
| -rw-r--r-- | library/alloc/tests/arc.rs | 15 | ||||
| -rw-r--r-- | library/alloc/tests/rc.rs | 15 |
2 files changed, 30 insertions, 0 deletions
diff --git a/library/alloc/tests/arc.rs b/library/alloc/tests/arc.rs index c02ba267056..ce40b5c9b0a 100644 --- a/library/alloc/tests/arc.rs +++ b/library/alloc/tests/arc.rs @@ -195,3 +195,18 @@ fn shared_from_iter_trustedlen_no_fuse() { assert_trusted_len(&iter); assert_eq!(&[Box::new(42), Box::new(24)], &*iter.collect::<Rc<[_]>>()); } + +#[test] +fn weak_may_dangle() { + fn hmm<'a>(val: &'a mut Weak<&'a str>) -> Weak<&'a str> { + val.clone() + } + + // Without #[may_dangle] we get: + let mut val = Weak::new(); + hmm(&mut val); + // ~~~~~~~~ borrowed value does not live long enough + // + // `val` dropped here while still borrowed + // borrow might be used here, when `val` is dropped and runs the `Drop` code for type `std::sync::Weak` +} diff --git a/library/alloc/tests/rc.rs b/library/alloc/tests/rc.rs index 501b4f0f816..efb39a60966 100644 --- a/library/alloc/tests/rc.rs +++ b/library/alloc/tests/rc.rs @@ -191,3 +191,18 @@ fn shared_from_iter_trustedlen_no_fuse() { assert_trusted_len(&iter); assert_eq!(&[Box::new(42), Box::new(24)], &*iter.collect::<Rc<[_]>>()); } + +#[test] +fn weak_may_dangle() { + fn hmm<'a>(val: &'a mut Weak<&'a str>) -> Weak<&'a str> { + val.clone() + } + + // Without #[may_dangle] we get: + let mut val = Weak::new(); + hmm(&mut val); + // ~~~~~~~~ borrowed value does not live long enough + // + // `val` dropped here while still borrowed + // borrow might be used here, when `val` is dropped and runs the `Drop` code for type `std::rc::Weak` +} |
