diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:03 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:03 +0000 |
commit | 64d98f8ee037282c35007b64c2649055c56af1db (patch) | |
tree | 5492bcf97fce41ee1c0b1cc2add283f3e66cdab0 /tests/ui/borrowck/borrowck-field-sensitivity.rs | |
parent | Adding debian version 1.67.1+dfsg1-1. (diff) | |
download | rustc-64d98f8ee037282c35007b64c2649055c56af1db.tar.xz rustc-64d98f8ee037282c35007b64c2649055c56af1db.zip |
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/borrowck/borrowck-field-sensitivity.rs')
-rw-r--r-- | tests/ui/borrowck/borrowck-field-sensitivity.rs | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/tests/ui/borrowck/borrowck-field-sensitivity.rs b/tests/ui/borrowck/borrowck-field-sensitivity.rs new file mode 100644 index 000000000..03edf445e --- /dev/null +++ b/tests/ui/borrowck/borrowck-field-sensitivity.rs @@ -0,0 +1,116 @@ +struct A { a: isize, b: Box<isize> } + + + +fn deref_after_move() { + let x = A { a: 1, b: Box::new(2) }; + drop(x.b); + drop(*x.b); //~ ERROR use of moved value: `x.b` +} + +fn deref_after_fu_move() { + let x = A { a: 1, b: Box::new(2) }; + let y = A { a: 3, .. x }; + drop(*x.b); //~ ERROR use of moved value: `x.b` +} + +fn borrow_after_move() { + let x = A { a: 1, b: Box::new(2) }; + drop(x.b); + let p = &x.b; //~ ERROR borrow of moved value: `x.b` + drop(**p); +} + +fn borrow_after_fu_move() { + let x = A { a: 1, b: Box::new(2) }; + let _y = A { a: 3, .. x }; + let p = &x.b; //~ ERROR borrow of moved value: `x.b` + drop(**p); +} + +fn move_after_borrow() { + let x = A { a: 1, b: Box::new(2) }; + let p = &x.b; + drop(x.b); //~ ERROR cannot move out of `x.b` because it is borrowed + drop(**p); +} + +fn fu_move_after_borrow() { + let x = A { a: 1, b: Box::new(2) }; + let p = &x.b; + let _y = A { a: 3, .. x }; //~ ERROR cannot move out of `x.b` because it is borrowed + drop(**p); +} + +fn mut_borrow_after_mut_borrow() { + let mut x = A { a: 1, b: Box::new(2) }; + let p = &mut x.a; + let q = &mut x.a; //~ ERROR cannot borrow `x.a` as mutable more than once at a time + drop(*p); + drop(*q); +} + +fn move_after_move() { + let x = A { a: 1, b: Box::new(2) }; + drop(x.b); + drop(x.b); //~ ERROR use of moved value: `x.b` +} + +fn move_after_fu_move() { + let x = A { a: 1, b: Box::new(2) }; + let _y = A { a: 3, .. x }; + drop(x.b); //~ ERROR use of moved value: `x.b` +} + +fn fu_move_after_move() { + let x = A { a: 1, b: Box::new(2) }; + drop(x.b); + let _z = A { a: 3, .. x }; //~ ERROR use of moved value: `x.b` +} + +fn fu_move_after_fu_move() { + let x = A { a: 1, b: Box::new(2) }; + let _y = A { a: 3, .. x }; + let _z = A { a: 4, .. x }; //~ ERROR use of moved value: `x.b` +} + +// The following functions aren't yet accepted, but they should be. + +fn copy_after_field_assign_after_uninit() { + let mut x: A; + x.a = 1; //~ ERROR E0381 + drop(x.a); +} + +fn borrow_after_field_assign_after_uninit() { + let mut x: A; + x.a = 1; //~ ERROR E0381 + let p = &x.a; + drop(*p); +} + +fn move_after_field_assign_after_uninit() { + let mut x: A; + x.b = Box::new(1); //~ ERROR E0381 + drop(x.b); +} + +fn main() { + deref_after_move(); + deref_after_fu_move(); + + borrow_after_move(); + borrow_after_fu_move(); + move_after_borrow(); + fu_move_after_borrow(); + mut_borrow_after_mut_borrow(); + + move_after_move(); + move_after_fu_move(); + fu_move_after_move(); + fu_move_after_fu_move(); + + copy_after_field_assign_after_uninit(); + borrow_after_field_assign_after_uninit(); + move_after_field_assign_after_uninit(); +} |