about summary refs log tree commit diff
path: root/src/test/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui')
-rw-r--r--src/test/ui/infinite/infinite-struct.rs10
-rw-r--r--src/test/ui/infinite/infinite-struct.stderr27
2 files changed, 37 insertions, 0 deletions
diff --git a/src/test/ui/infinite/infinite-struct.rs b/src/test/ui/infinite/infinite-struct.rs
new file mode 100644
index 00000000000..70a203ea6e8
--- /dev/null
+++ b/src/test/ui/infinite/infinite-struct.rs
@@ -0,0 +1,10 @@
+struct Take(Take);
+//~^ ERROR has infinite size
+//~| ERROR cycle detected
+
+// check that we don't hang trying to find the tail of a recursive struct (#79437)
+fn foo() -> Take {
+    Take(loop {})
+}
+
+fn main() {}
diff --git a/src/test/ui/infinite/infinite-struct.stderr b/src/test/ui/infinite/infinite-struct.stderr
new file mode 100644
index 00000000000..d180670e38f
--- /dev/null
+++ b/src/test/ui/infinite/infinite-struct.stderr
@@ -0,0 +1,27 @@
+error[E0072]: recursive type `Take` has infinite size
+  --> $DIR/infinite-struct.rs:1:1
+   |
+LL | struct Take(Take);
+   | ^^^^^^^^^^^^----^^
+   | |           |
+   | |           recursive without indirection
+   | recursive type has infinite size
+   |
+help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Take` representable
+   |
+LL | struct Take(Box<Take>);
+   |             ^^^^    ^
+
+error[E0391]: cycle detected when computing drop-check constraints for `Take`
+  --> $DIR/infinite-struct.rs:1:1
+   |
+LL | struct Take(Take);
+   | ^^^^^^^^^^^^^^^^^^
+   |
+   = note: ...which again requires computing drop-check constraints for `Take`, completing the cycle
+   = note: cycle used when computing dropck types for `Canonical { max_universe: U0, variables: [], value: ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: Take } }`
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0072, E0391.
+For more information about an error, try `rustc --explain E0072`.