diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:02:58 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:02:58 +0000 |
commit | 698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch) | |
tree | 173a775858bd501c378080a10dca74132f05bc50 /src/test/ui/borrowck/borrowck-lend-flow-if.rs | |
parent | Initial commit. (diff) | |
download | rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip |
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/test/ui/borrowck/borrowck-lend-flow-if.rs')
-rw-r--r-- | src/test/ui/borrowck/borrowck-lend-flow-if.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/test/ui/borrowck/borrowck-lend-flow-if.rs b/src/test/ui/borrowck/borrowck-lend-flow-if.rs new file mode 100644 index 000000000..19a0dd0c6 --- /dev/null +++ b/src/test/ui/borrowck/borrowck-lend-flow-if.rs @@ -0,0 +1,51 @@ +// Note: the borrowck analysis is currently flow-insensitive. +// Therefore, some of these errors are marked as spurious and could be +// corrected by a simple change to the analysis. The others are +// either genuine or would require more advanced changes. The latter +// cases are noted. + + + +fn borrow(_v: &isize) {} +fn borrow_mut(_v: &mut isize) {} +fn cond() -> bool { panic!() } +fn for_func<F>(_f: F) where F: FnOnce() -> bool { panic!() } +fn produce<T>() -> T { panic!(); } + +fn inc(v: &mut Box<isize>) { + *v = Box::new(**v + 1); +} + +fn pre_freeze_cond() { + // In this instance, the freeze is conditional and starts before + // the mut borrow. + + let u = Box::new(0); + let mut v: Box<_> = Box::new(3); + let mut _w = &u; + if cond() { + _w = &v; + } + borrow_mut(&mut *v); //~ ERROR cannot borrow + _w.use_ref(); +} + +fn pre_freeze_else() { + // In this instance, the freeze and mut borrow are on separate sides + // of the if. + + let u = Box::new(0); + let mut v: Box<_> = Box::new(3); + let mut _w = &u; + if cond() { + _w = &v; + } else { + borrow_mut(&mut *v); + } + _w.use_ref(); +} + +fn main() {} + +trait Fake { fn use_mut(&mut self) { } fn use_ref(&self) { } } +impl<T> Fake for T { } |