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/span/borrowck-call-is-borrow-issue-12224.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/span/borrowck-call-is-borrow-issue-12224.rs')
-rw-r--r-- | src/test/ui/span/borrowck-call-is-borrow-issue-12224.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/test/ui/span/borrowck-call-is-borrow-issue-12224.rs b/src/test/ui/span/borrowck-call-is-borrow-issue-12224.rs new file mode 100644 index 000000000..938fdaf11 --- /dev/null +++ b/src/test/ui/span/borrowck-call-is-borrow-issue-12224.rs @@ -0,0 +1,62 @@ +#![feature(fn_traits)] + +// Ensure that invoking a closure counts as a unique immutable borrow + +type Fn<'a> = Box<dyn FnMut() + 'a>; + +struct Test<'a> { + f: Box<dyn FnMut() + 'a> +} + +fn call<F>(mut f: F) where F: FnMut(Fn) { + f(Box::new(|| { + //~^ ERROR: cannot borrow `f` as mutable more than once + f((Box::new(|| {}))) + })); +} + +fn test1() { + call(|mut a| { + a.call_mut(()); + }); +} + +fn test2<F>(f: &F) where F: FnMut() { + (*f)(); + //~^ ERROR cannot borrow `*f` as mutable, as it is behind a `&` reference +} + +fn test3<F>(f: &mut F) where F: FnMut() { + (*f)(); +} + +fn test4(f: &Test) { + f.f.call_mut(()) + //~^ ERROR: cannot borrow `f.f` as mutable, as it is behind a `&` reference +} + +fn test5(f: &mut Test) { + f.f.call_mut(()) +} + +fn test6() { + let mut f = || {}; + (|| { + f(); + })(); +} + +fn test7() { + fn foo<F>(_: F) where F: FnMut(Box<dyn FnMut(isize)>, isize) {} + let s = String::new(); // Capture to make f !Copy + let mut f = move |g: Box<dyn FnMut(isize)>, b: isize| { + let _ = s.len(); + }; + f(Box::new(|a| { + //~^ ERROR cannot move out of `f` because it is borrowed + foo(f); + //~^ ERROR cannot move out of `f`, a captured variable in an `FnMut` closure + }), 3); +} + +fn main() {} |