From 218caa410aa38c29984be31a5229b9fa717560ee Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:19:13 +0200 Subject: Merging upstream version 1.68.2+dfsg1. Signed-off-by: Daniel Baumann --- tests/ui/closure_context/issue-26046-fn-mut.rs | 11 +++++++++++ tests/ui/closure_context/issue-26046-fn-mut.stderr | 16 ++++++++++++++++ tests/ui/closure_context/issue-26046-fn-once.rs | 11 +++++++++++ .../ui/closure_context/issue-26046-fn-once.stderr | 16 ++++++++++++++++ tests/ui/closure_context/issue-42065.rs | 13 +++++++++++++ tests/ui/closure_context/issue-42065.stderr | 22 ++++++++++++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 tests/ui/closure_context/issue-26046-fn-mut.rs create mode 100644 tests/ui/closure_context/issue-26046-fn-mut.stderr create mode 100644 tests/ui/closure_context/issue-26046-fn-once.rs create mode 100644 tests/ui/closure_context/issue-26046-fn-once.stderr create mode 100644 tests/ui/closure_context/issue-42065.rs create mode 100644 tests/ui/closure_context/issue-42065.stderr (limited to 'tests/ui/closure_context') diff --git a/tests/ui/closure_context/issue-26046-fn-mut.rs b/tests/ui/closure_context/issue-26046-fn-mut.rs new file mode 100644 index 000000000..0a015ea14 --- /dev/null +++ b/tests/ui/closure_context/issue-26046-fn-mut.rs @@ -0,0 +1,11 @@ +fn foo() -> Box { + let num = 5; + + let closure = || { //~ ERROR expected a closure that + num += 1; + }; + + Box::new(closure) +} + +fn main() {} diff --git a/tests/ui/closure_context/issue-26046-fn-mut.stderr b/tests/ui/closure_context/issue-26046-fn-mut.stderr new file mode 100644 index 000000000..f744b71c2 --- /dev/null +++ b/tests/ui/closure_context/issue-26046-fn-mut.stderr @@ -0,0 +1,16 @@ +error[E0525]: expected a closure that implements the `Fn` trait, but this closure only implements `FnMut` + --> $DIR/issue-26046-fn-mut.rs:4:19 + | +LL | let closure = || { + | ^^ this closure implements `FnMut`, not `Fn` +LL | num += 1; + | --- closure is `FnMut` because it mutates the variable `num` here +... +LL | Box::new(closure) + | ----------------- the requirement to implement `Fn` derives from here + | + = note: required for the cast from `[closure@$DIR/issue-26046-fn-mut.rs:4:19: 4:21]` to the object type `dyn Fn()` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0525`. diff --git a/tests/ui/closure_context/issue-26046-fn-once.rs b/tests/ui/closure_context/issue-26046-fn-once.rs new file mode 100644 index 000000000..511690e9d --- /dev/null +++ b/tests/ui/closure_context/issue-26046-fn-once.rs @@ -0,0 +1,11 @@ +fn get_closure() -> Box Vec> { + let vec = vec![1u8, 2u8]; + + let closure = move || { //~ ERROR expected a closure + vec + }; + + Box::new(closure) +} + +fn main() {} diff --git a/tests/ui/closure_context/issue-26046-fn-once.stderr b/tests/ui/closure_context/issue-26046-fn-once.stderr new file mode 100644 index 000000000..34f94f9dc --- /dev/null +++ b/tests/ui/closure_context/issue-26046-fn-once.stderr @@ -0,0 +1,16 @@ +error[E0525]: expected a closure that implements the `Fn` trait, but this closure only implements `FnOnce` + --> $DIR/issue-26046-fn-once.rs:4:19 + | +LL | let closure = move || { + | ^^^^^^^ this closure implements `FnOnce`, not `Fn` +LL | vec + | --- closure is `FnOnce` because it moves the variable `vec` out of its environment +... +LL | Box::new(closure) + | ----------------- the requirement to implement `Fn` derives from here + | + = note: required for the cast from `[closure@$DIR/issue-26046-fn-once.rs:4:19: 4:26]` to the object type `dyn Fn() -> Vec` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0525`. diff --git a/tests/ui/closure_context/issue-42065.rs b/tests/ui/closure_context/issue-42065.rs new file mode 100644 index 000000000..c506600f4 --- /dev/null +++ b/tests/ui/closure_context/issue-42065.rs @@ -0,0 +1,13 @@ +use std::collections::HashMap; + +fn main() { + let dict: HashMap = HashMap::new(); + let debug_dump_dict = || { + for (key, value) in dict { + println!("{:?} - {:?}", key, value); + } + }; + debug_dump_dict(); + debug_dump_dict(); + //~^ ERROR use of moved value: `debug_dump_dict` +} diff --git a/tests/ui/closure_context/issue-42065.stderr b/tests/ui/closure_context/issue-42065.stderr new file mode 100644 index 000000000..896bb6dc6 --- /dev/null +++ b/tests/ui/closure_context/issue-42065.stderr @@ -0,0 +1,22 @@ +error[E0382]: use of moved value: `debug_dump_dict` + --> $DIR/issue-42065.rs:11:5 + | +LL | debug_dump_dict(); + | ----------------- `debug_dump_dict` moved due to this call +LL | debug_dump_dict(); + | ^^^^^^^^^^^^^^^ value used here after move + | +note: closure cannot be invoked more than once because it moves the variable `dict` out of its environment + --> $DIR/issue-42065.rs:6:29 + | +LL | for (key, value) in dict { + | ^^^^ +note: this value implements `FnOnce`, which causes it to be moved when called + --> $DIR/issue-42065.rs:10:5 + | +LL | debug_dump_dict(); + | ^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0382`. -- cgit v1.2.3