| //@compile-flags: -Zmiri-tree-borrows | |
| // This test is the TB counterpart to fail/stacked_borrows/fnentry_invalidation, | |
| // but the SB version passes TB without error. | |
| // An additional write access is inserted so that this test properly fails. | |
| // Test that spans displayed in diagnostics identify the function call, not the function | |
| // definition, as the location of invalidation due to FnEntry retag. Technically the FnEntry retag | |
| // occurs inside the function, but what the user wants to know is which call produced the | |
| // invalidation. | |
| fn main() { | |
| let mut x = 0i32; | |
| let z = &mut x as *mut i32; | |
| unsafe { | |
| *z = 1; | |
| } | |
| x.do_bad(); | |
| unsafe { | |
| *z = 2; //~ ERROR: /write access through .* is forbidden/ | |
| } | |
| } | |
| trait Bad { | |
| fn do_bad(&mut self) { | |
| // who knows | |
| } | |
| } | |
| impl Bad for i32 {} |