about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthew Jasper <mjjasper1@gmail.com>2019-06-03 13:46:38 +0100
committerMatthew Jasper <mjjasper1@gmail.com>2019-06-03 13:46:38 +0100
commit2751b867a7fa0b14dbe5ca5f315e8f373bf8a5f3 (patch)
tree89d44a03007215fdce46aa1d34ec4484b8f08acf
parentc57ed9d9478dcd12c854a0ef4e83c7f384ade060 (diff)
downloadrust-2751b867a7fa0b14dbe5ca5f315e8f373bf8a5f3.tar.gz
rust-2751b867a7fa0b14dbe5ca5f315e8f373bf8a5f3.zip
Don't try to lower ReEmpty in NLL
-rw-r--r--src/librustc_mir/borrow_check/nll/type_check/free_region_relations.rs7
-rw-r--r--src/test/ui/nll/empty-type-predicate.rs11
2 files changed, 18 insertions, 0 deletions
diff --git a/src/librustc_mir/borrow_check/nll/type_check/free_region_relations.rs b/src/librustc_mir/borrow_check/nll/type_check/free_region_relations.rs
index 3b663ef6dad..361353f8df4 100644
--- a/src/librustc_mir/borrow_check/nll/type_check/free_region_relations.rs
+++ b/src/librustc_mir/borrow_check/nll/type_check/free_region_relations.rs
@@ -334,6 +334,13 @@ impl UniversalRegionRelationsBuilder<'cx, 'gcx, 'tcx> {
 
             match outlives_bound {
                 OutlivesBound::RegionSubRegion(r1, r2) => {
+                    // `where Type:` is lowered to `where Type: 'empty` so that
+                    // we check `Type` is well formed, but there's no use for
+                    // this bound here.
+                    if let ty::ReEmpty = r1 {
+                        return;
+                    }
+
                     // The bound says that `r1 <= r2`; we store `r2: r1`.
                     let r1 = self.universal_regions.to_region_vid(r1);
                     let r2 = self.universal_regions.to_region_vid(r2);
diff --git a/src/test/ui/nll/empty-type-predicate.rs b/src/test/ui/nll/empty-type-predicate.rs
new file mode 100644
index 00000000000..75431d40ce5
--- /dev/null
+++ b/src/test/ui/nll/empty-type-predicate.rs
@@ -0,0 +1,11 @@
+// Regression test for #61315
+//
+// `dyn T:` is lowered to `dyn T: ReEmpty` - check that we don't ICE in NLL for
+// the unexpected region.
+
+// compile-pass
+
+trait T {}
+fn f() where dyn T: {}
+
+fn main() {}