diff options
Diffstat (limited to 'src/test/ui/regions/region-borrow-params-issue-29793-big.rs')
-rw-r--r-- | src/test/ui/regions/region-borrow-params-issue-29793-big.rs | 74 |
1 files changed, 0 insertions, 74 deletions
diff --git a/src/test/ui/regions/region-borrow-params-issue-29793-big.rs b/src/test/ui/regions/region-borrow-params-issue-29793-big.rs deleted file mode 100644 index 83b1a6eab..000000000 --- a/src/test/ui/regions/region-borrow-params-issue-29793-big.rs +++ /dev/null @@ -1,74 +0,0 @@ -// Issue #29793, big regression test: do not let borrows of -// parameters to ever be returned (expanded with exploration of -// variations). -// -// This is the version of the test that actually exposed unsound -// behavior (because the improperly accepted closure was actually -// able to be invoked). - -struct WrapA<F>(Option<F>); - -impl<F> WrapA<F> { - fn new() -> WrapA<F> { - WrapA(None) - } - fn set(mut self, f: F) -> Self { - self.0 = Some(f); - self - } -} - -struct WrapB<F>(Option<F>); - -impl<F> WrapB<F> { - fn new() -> WrapB<F> { - WrapB(None) - } - fn set(mut self, f: F) -> Self { - self.0 = Some(f); - self - } -} - -trait DoStuff : Sized { - fn handle(self); -} - -impl<F, T> DoStuff for WrapA<F> - where F: FnMut(usize, usize) -> T, T: DoStuff { - fn handle(mut self) { - if let Some(ref mut f) = self.0 { - let x = f(1, 2); - let _foo = [0usize; 16]; - x.handle(); - } - } - } - -impl<F> DoStuff for WrapB<F> where F: FnMut(bool) -> usize { - fn handle(mut self) { - if let Some(ref mut f) = self.0 { - println!("{}", f(true)); - } - } -} - -impl<F, T> WrapA<F> - where F: FnMut(usize, usize) -> T, T: DoStuff { - fn handle_ref(&mut self) { - if let Some(ref mut f) = self.0 { - let x = f(1, 2); - } - } - } - -fn main() { - let mut w = WrapA::new().set(|x: usize, y: usize| { - WrapB::new().set(|t: bool| if t { x } else { y }) // (separate errors for `x` vs `y`) - //~^ ERROR closure may outlive the current function - //~| ERROR closure may outlive the current function - }); - - w.handle(); // This works - // w.handle_ref(); // This doesn't -} |