diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2025-07-01 17:47:03 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-01 17:47:03 +0200 |
| commit | 65942afb9756902410e1133506f9990654b31c2b (patch) | |
| tree | 4dc8e0fa5a7376b16a6a564a9105546427f5efe5 /tests/ui/closures | |
| parent | ff0a5f5ad79b1e2bdd76c14246ac0dd236ca5a12 (diff) | |
| parent | da5c6395dad7c5be33f842c3660ae2f6af287f3a (diff) | |
| download | rust-65942afb9756902410e1133506f9990654b31c2b.tar.gz rust-65942afb9756902410e1133506f9990654b31c2b.zip | |
Rollup merge of #143212 - Kivooeo:tf20, r=tgross35
`tests/ui`: A New Order [20/N] > [!NOTE] > > Intermediate commits are intended to help review, but will be squashed prior to merge. Some `tests/ui/` housekeeping, to trim down number of tests directly under `tests/ui/`. Part of rust-lang/rust#133895. r? `@tgross35`
Diffstat (limited to 'tests/ui/closures')
| -rw-r--r-- | tests/ui/closures/closure-clone-requires-captured-clone.rs | 19 | ||||
| -rw-r--r-- | tests/ui/closures/closure-clone-requires-captured-clone.stderr | 23 |
2 files changed, 42 insertions, 0 deletions
diff --git a/tests/ui/closures/closure-clone-requires-captured-clone.rs b/tests/ui/closures/closure-clone-requires-captured-clone.rs new file mode 100644 index 00000000000..80938e50b67 --- /dev/null +++ b/tests/ui/closures/closure-clone-requires-captured-clone.rs @@ -0,0 +1,19 @@ +//! Test that closures only implement `Clone` if all captured values implement `Clone`. +//! +//! When a closure captures variables from its environment, it can only be cloned +//! if all those captured variables are cloneable. This test makes sure the compiler +//! properly rejects attempts to clone closures that capture non-Clone types. + +//@ compile-flags: --diagnostic-width=300 + +struct NonClone(i32); + +fn main() { + let captured_value = NonClone(5); + let closure = move || { + let _ = captured_value.0; + }; + + closure.clone(); + //~^ ERROR the trait bound `NonClone: Clone` is not satisfied +} diff --git a/tests/ui/closures/closure-clone-requires-captured-clone.stderr b/tests/ui/closures/closure-clone-requires-captured-clone.stderr new file mode 100644 index 00000000000..785cc8a3032 --- /dev/null +++ b/tests/ui/closures/closure-clone-requires-captured-clone.stderr @@ -0,0 +1,23 @@ +error[E0277]: the trait bound `NonClone: Clone` is not satisfied in `{closure@$DIR/closure-clone-requires-captured-clone.rs:13:19: 13:26}` + --> $DIR/closure-clone-requires-captured-clone.rs:17:13 + | +LL | let closure = move || { + | ------- within this `{closure@$DIR/closure-clone-requires-captured-clone.rs:13:19: 13:26}` +... +LL | closure.clone(); + | ^^^^^ within `{closure@$DIR/closure-clone-requires-captured-clone.rs:13:19: 13:26}`, the trait `Clone` is not implemented for `NonClone` + | +note: required because it's used within this closure + --> $DIR/closure-clone-requires-captured-clone.rs:13:19 + | +LL | let closure = move || { + | ^^^^^^^ +help: consider annotating `NonClone` with `#[derive(Clone)]` + | +LL + #[derive(Clone)] +LL | struct NonClone(i32); + | + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0277`. |
