From 5aeb6c756e4b6e28366dee28802022430c66605e Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Sat, 3 Nov 2018 02:24:50 +0100 Subject: [PATCH 1/2] Sidestep an ICE by providing *some* description for `ReEmpty` when it arises. --- src/librustc/infer/error_reporting/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/librustc/infer/error_reporting/mod.rs b/src/librustc/infer/error_reporting/mod.rs index d19c495af3b96..6c5f10332956d 100644 --- a/src/librustc/infer/error_reporting/mod.rs +++ b/src/librustc/infer/error_reporting/mod.rs @@ -178,6 +178,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { self.msg_span_from_early_bound_and_free_regions(region) } ty::ReStatic => ("the static lifetime".to_owned(), None), + ty::ReEmpty => ("an empty lifetime".to_owned(), None), _ => bug!("{:?}", region), } } From cc33aecb683b1cb08bd60ba1f24ef797827fda94 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Sat, 3 Nov 2018 02:29:26 +0100 Subject: [PATCH 2/2] Regression test for issue 55608. --- .../issue-55608-captures-empty-region.rs | 22 +++++++++++++++++++ .../issue-55608-captures-empty-region.stderr | 11 ++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/test/ui/impl-trait/issue-55608-captures-empty-region.rs create mode 100644 src/test/ui/impl-trait/issue-55608-captures-empty-region.stderr diff --git a/src/test/ui/impl-trait/issue-55608-captures-empty-region.rs b/src/test/ui/impl-trait/issue-55608-captures-empty-region.rs new file mode 100644 index 0000000000000..7ebc348996f5e --- /dev/null +++ b/src/test/ui/impl-trait/issue-55608-captures-empty-region.rs @@ -0,0 +1,22 @@ +// This used to ICE because it creates an `impl Trait` that captures a +// hidden empty region. + +#![feature(conservative_impl_trait)] + +fn server() -> impl FilterBase2 { //~ ERROR [E0700] + segment2(|| { loop { } }).map2(|| "") +} + +trait FilterBase2 { + fn map2(self, _fn: F) -> Map2 where Self: Sized { loop { } } +} + +struct Map2 { _func: F } + +impl FilterBase2 for Map2 { } + +fn segment2(_fn: F) -> Map2 where F: Fn() -> Result<(), ()> { + loop { } +} + +fn main() { server(); } diff --git a/src/test/ui/impl-trait/issue-55608-captures-empty-region.stderr b/src/test/ui/impl-trait/issue-55608-captures-empty-region.stderr new file mode 100644 index 0000000000000..d1f147834d2ef --- /dev/null +++ b/src/test/ui/impl-trait/issue-55608-captures-empty-region.stderr @@ -0,0 +1,11 @@ +error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds + --> $DIR/issue-55608-captures-empty-region.rs:6:16 + | +LL | fn server() -> impl FilterBase2 { //~ ERROR [E0700] + | ^^^^^^^^^^^^^^^^ + | + = note: hidden type `Map2<[closure@$DIR/issue-55608-captures-empty-region.rs:7:36: 7:41]>` captures an empty lifetime + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0700`.