From 4843f227885bf23a34cc8485173c11601b00d977 Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Mon, 30 Dec 2019 13:30:34 +0000 Subject: Handle recursive instantiation of drop shims --- src/librustc_mir/monomorphize/collector.rs | 4 ++-- src/test/ui/issues/issue-26548.rs | 13 ------------- src/test/ui/issues/issue-26548.stderr | 13 ------------- src/test/ui/issues/issue-38591.rs | 10 ---------- .../ui/recursion/issue-26548-recursion-via-normalize.rs | 13 +++++++++++++ .../issue-26548-recursion-via-normalize.stderr | 13 +++++++++++++ .../issue-38591-non-regular-dropck-recursion.rs | 17 +++++++++++++++++ .../issue-38591-non-regular-dropck-recursion.stderr | 4 ++++ 8 files changed, 49 insertions(+), 38 deletions(-) delete mode 100644 src/test/ui/issues/issue-26548.rs delete mode 100644 src/test/ui/issues/issue-26548.stderr delete mode 100644 src/test/ui/issues/issue-38591.rs create mode 100644 src/test/ui/recursion/issue-26548-recursion-via-normalize.rs create mode 100644 src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr 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 (limited to 'src') 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-26548.rs b/src/test/ui/issues/issue-26548.rs deleted file mode 100644 index 6ee8c0fcfda..00000000000 --- a/src/test/ui/issues/issue-26548.rs +++ /dev/null @@ -1,13 +0,0 @@ -//~ ERROR cycle detected when computing layout of -//~| NOTE ...which requires computing layout of -//~| NOTE ...which again requires computing layout of - -// build-fail - -trait Mirror { type It: ?Sized; } -impl Mirror for T { type It = Self; } -struct S(Option<::It>); - -fn main() { //~ NOTE cycle used when processing `main` - let _s = S(None); -} diff --git a/src/test/ui/issues/issue-26548.stderr b/src/test/ui/issues/issue-26548.stderr deleted file mode 100644 index 3c213674e4b..00000000000 --- a/src/test/ui/issues/issue-26548.stderr +++ /dev/null @@ -1,13 +0,0 @@ -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 - | -LL | fn main() { - | ^^^^^^^^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0391`. 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, - s : Box> -} - -fn f(x : S) {} - -fn main () {} diff --git a/src/test/ui/recursion/issue-26548-recursion-via-normalize.rs b/src/test/ui/recursion/issue-26548-recursion-via-normalize.rs new file mode 100644 index 00000000000..6ee8c0fcfda --- /dev/null +++ b/src/test/ui/recursion/issue-26548-recursion-via-normalize.rs @@ -0,0 +1,13 @@ +//~ ERROR cycle detected when computing layout of +//~| NOTE ...which requires computing layout of +//~| NOTE ...which again requires computing layout of + +// build-fail + +trait Mirror { type It: ?Sized; } +impl Mirror for T { type It = Self; } +struct S(Option<::It>); + +fn main() { //~ NOTE cycle used when processing `main` + let _s = S(None); +} diff --git a/src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr b/src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr new file mode 100644 index 00000000000..6a83f91ce5b --- /dev/null +++ b/src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr @@ -0,0 +1,13 @@ +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-recursion-via-normalize.rs:11:1 + | +LL | fn main() { + | ^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0391`. 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` 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 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::> - shim(Some(S))` + +error: aborting due to previous error + -- cgit 1.4.1-3-g733a5