about summary refs log tree commit diff
path: root/tests/ui/closures
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2025-07-01 17:47:03 +0200
committerGitHub <noreply@github.com>2025-07-01 17:47:03 +0200
commit65942afb9756902410e1133506f9990654b31c2b (patch)
tree4dc8e0fa5a7376b16a6a564a9105546427f5efe5 /tests/ui/closures
parentff0a5f5ad79b1e2bdd76c14246ac0dd236ca5a12 (diff)
parentda5c6395dad7c5be33f842c3660ae2f6af287f3a (diff)
downloadrust-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.rs19
-rw-r--r--tests/ui/closures/closure-clone-requires-captured-clone.stderr23
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`.