From 4843f227885bf23a34cc8485173c11601b00d977 Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Mon, 30 Dec 2019 13:30:34 +0000 Subject: [PATCH] Handle recursive instantiation of drop shims --- src/librustc_mir/monomorphize/collector.rs | 4 ++-- src/test/ui/issues/issue-38591.rs | 10 ---------- .../issue-26548-recursion-via-normalize.rs} | 0 .../issue-26548-recursion-via-normalize.stderr} | 2 +- .../issue-38591-non-regular-dropck-recursion.rs | 17 +++++++++++++++++ ...ue-38591-non-regular-dropck-recursion.stderr | 4 ++++ 6 files changed, 24 insertions(+), 13 deletions(-) delete mode 100644 src/test/ui/issues/issue-38591.rs rename src/test/ui/{issues/issue-26548.rs => recursion/issue-26548-recursion-via-normalize.rs} (100%) rename src/test/ui/{issues/issue-26548.stderr => recursion/issue-26548-recursion-via-normalize.stderr} (88%) create mode 100644 src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs create mode 100644 src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 0a783337ad150..dfc3c4cd76947 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 2f594b48e697f..0000000000000 --- a/src/test/ui/issues/issue-38591.rs +++ /dev/null @@ -1,10 +0,0 @@ -// check-pass - -struct S { - t : T, - s : Box> -} - -fn f(x : S) {} - -fn main () {} diff --git a/src/test/ui/issues/issue-26548.rs b/src/test/ui/recursion/issue-26548-recursion-via-normalize.rs similarity index 100% rename from src/test/ui/issues/issue-26548.rs rename to 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 similarity index 88% rename from src/test/ui/issues/issue-26548.stderr rename to src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr index 3c213674e4b70..6a83f91ce5b32 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` = note: ...which requires computing layout of `S`... = note: ...which again requires computing layout of `std::option::Option`, 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 0000000000000..0fcf77d8722d6 --- /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` 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, + s: Box>, +} + +fn f(x: S) {} + +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 0000000000000..77309a82a0fa7 --- /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::> - shim(Some(S))` + +error: aborting due to previous error +