diff options
| author | Matthew Jasper <mjjasper1@gmail.com> | 2019-12-30 13:30:34 +0000 |
|---|---|---|
| committer | Matthew Jasper <mjjasper1@gmail.com> | 2019-12-30 13:41:07 +0000 |
| commit | 4843f227885bf23a34cc8485173c11601b00d977 (patch) | |
| tree | 5d56ca4ff8eca066afc1df30590583142743dcc3 /src | |
| parent | 580ac0b4f1c6f9cf76f6edafdaf9806437770aff (diff) | |
| download | rust-4843f227885bf23a34cc8485173c11601b00d977.tar.gz rust-4843f227885bf23a34cc8485173c11601b00d977.zip | |
Handle recursive instantiation of drop shims
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_mir/monomorphize/collector.rs | 4 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-38591.rs | 10 | ||||
| -rw-r--r-- | src/test/ui/recursion/issue-26548-recursion-via-normalize.rs (renamed from src/test/ui/issues/issue-26548.rs) | 0 | ||||
| -rw-r--r-- | src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr (renamed from src/test/ui/issues/issue-26548.stderr) | 2 | ||||
| -rw-r--r-- | src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr | 4 |
6 files changed, 24 insertions, 13 deletions
diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 0a783337ad1..dfc3c4cd769 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -423,7 +423,7 @@ fn check_recursion_limit<'tcx>( let recursion_depth = recursion_depths.get(&def_id).cloned().unwrap_or(0); debug!(" => recursion depth={}", recursion_depth); - let recursion_depth = if Some(def_id) == tcx.lang_items().drop_in_place_fn() { + let adjusted_recursion_depth = if Some(def_id) == tcx.lang_items().drop_in_place_fn() { // HACK: drop_in_place creates tight monomorphization loops. Give // it more margin. recursion_depth / 4 @@ -434,7 +434,7 @@ fn check_recursion_limit<'tcx>( // Code that needs to instantiate the same function recursively // more than the recursion limit is assumed to be causing an // infinite expansion. - if recursion_depth > *tcx.sess.recursion_limit.get() { + if adjusted_recursion_depth > *tcx.sess.recursion_limit.get() { let error = format!("reached the recursion limit while instantiating `{}`", instance); if let Some(hir_id) = tcx.hir().as_local_hir_id(def_id) { tcx.sess.span_fatal(tcx.hir().span(hir_id), &error); diff --git a/src/test/ui/issues/issue-38591.rs b/src/test/ui/issues/issue-38591.rs deleted file mode 100644 index 2f594b48e69..00000000000 --- a/src/test/ui/issues/issue-38591.rs +++ /dev/null @@ -1,10 +0,0 @@ -// check-pass - -struct S<T> { - t : T, - s : Box<S<fn(u : T)>> -} - -fn f(x : S<u32>) {} - -fn main () {} diff --git a/src/test/ui/issues/issue-26548.rs b/src/test/ui/recursion/issue-26548-recursion-via-normalize.rs index 6ee8c0fcfda..6ee8c0fcfda 100644 --- a/src/test/ui/issues/issue-26548.rs +++ b/src/test/ui/recursion/issue-26548-recursion-via-normalize.rs diff --git a/src/test/ui/issues/issue-26548.stderr b/src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr index 3c213674e4b..6a83f91ce5b 100644 --- a/src/test/ui/issues/issue-26548.stderr +++ b/src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr @@ -3,7 +3,7 @@ error[E0391]: cycle detected when computing layout of `std::option::Option<S>` = note: ...which requires computing layout of `S`... = note: ...which again requires computing layout of `std::option::Option<S>`, completing the cycle note: cycle used when processing `main` - --> $DIR/issue-26548.rs:11:1 + --> $DIR/issue-26548-recursion-via-normalize.rs:11:1 | LL | fn main() { | ^^^^^^^^^ diff --git a/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs new file mode 100644 index 00000000000..0fcf77d8722 --- /dev/null +++ b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs @@ -0,0 +1,17 @@ +// Dropck shouldn't hit a recursion limit from checking `S<u32>` since it has +// no free regions or type parameters. +// Codegen however, has to error for the infinitely many `real_drop_in_place` +// functions it has been asked to create. +// build-fail + +struct S<T> { + t: T, + s: Box<S<fn(u: T)>>, +} + +fn f(x: S<u32>) {} + +fn main() { + // Force instantiation. + f as fn(_); +} diff --git a/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr new file mode 100644 index 00000000000..77309a82a0f --- /dev/null +++ b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr @@ -0,0 +1,4 @@ +error: reached the recursion limit while instantiating `std::ptr::real_drop_in_place::<S<fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(u32))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))>> - shim(Some(S<fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(u32))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))>))` + +error: aborting due to previous error + |
