diff options
| author | bors <bors@rust-lang.org> | 2020-12-05 15:58:06 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-12-05 15:58:06 +0000 |
| commit | 5bb68c31f8cef24174a7d3499de6b4ebea069900 (patch) | |
| tree | f021c48a63c43acbdbe56bd78293270a5ef88bc2 /src/test/ui/infinite | |
| parent | 9122b769c8306b1cb3c8d1f96fca3ea3e208e22e (diff) | |
| parent | 98fc02d6faeb39c7a4264af8ffdedc6a5a157f89 (diff) | |
| download | rust-5bb68c31f8cef24174a7d3499de6b4ebea069900.tar.gz rust-5bb68c31f8cef24174a7d3499de6b4ebea069900.zip | |
Auto merge of #79445 - SNCPlay42:struct-tail-recursion-limit, r=oli-obk
check the recursion limit when finding a struct's tail fixes #79437 This does a `delay_span_bug` (via `ty_error_with_message`) rather than emit a new error message, under the assumption that there will be an error elsewhere (even if the type isn't infinitely recursive, just deeper than the recursion limit, this appears to be the case).
Diffstat (limited to 'src/test/ui/infinite')
| -rw-r--r-- | src/test/ui/infinite/infinite-struct.rs | 10 | ||||
| -rw-r--r-- | src/test/ui/infinite/infinite-struct.stderr | 27 |
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`. |
