about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-06-17 12:31:56 +0000
committerbors <bors@rust-lang.org>2021-06-17 12:31:56 +0000
commit0ef2b4a29bf70e8984d0d2febb7a546856c554a0 (patch)
treea0572025f0b52531d684fae0549921a0add58bff
parentb17d9c1332693fc386f5374f0d63aae0ce5abab5 (diff)
parent09eed2889a2b959e35b6bed30ca4f53cc5a3e578 (diff)
downloadrust-0ef2b4a29bf70e8984d0d2febb7a546856c554a0.tar.gz
rust-0ef2b4a29bf70e8984d0d2febb7a546856c554a0.zip
Auto merge of #85755 - b-naber:unexpected_concrete_region, r=nikomatsakis
Replace parent substs of associated types with inference vars in borrow checker

Fixes https://github.com/rust-lang/rust/issues/83190
Fixes https://github.com/rust-lang/rust/issues/78450

When we normalize an associated type that refers to an opaque type, it can happen that the substs of the associated type do not occur in the projection (they are parent substs). We previously didn't replace those substs with inference vars, which left a concrete region after all regions should have already been replaced with inference vars and triggered a `delay_span_bug`. After we normalize the opaque type, we now try to replace any remaining concrete regions with inference vars.
-rw-r--r--compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs38
-rw-r--r--src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.rs33
-rw-r--r--src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.stderr13
-rw-r--r--src/test/ui/type-alias-impl-trait/issue-78450.rs27
-rw-r--r--src/test/ui/type-alias-impl-trait/issue-78450.stderr11
5 files changed, 49 insertions, 73 deletions
diff --git a/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs b/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs
index 3ec24156f22..f2d69255d50 100644
--- a/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs
+++ b/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs
@@ -60,33 +60,17 @@ impl<'tcx> RegionInferenceContext<'tcx> {
                 debug!(?concrete_type, ?substs);
 
                 let mut subst_regions = vec![self.universal_regions.fr_static];
-                let universal_substs =
-                    infcx.tcx.fold_regions(substs, &mut false, |region, _| match *region {
-                        ty::ReVar(vid) => {
-                            subst_regions.push(vid);
-                            self.definitions[vid].external_name.unwrap_or_else(|| {
-                                infcx.tcx.sess.delay_span_bug(
-                                    span,
-                                    "opaque type with non-universal region substs",
-                                );
-                                infcx.tcx.lifetimes.re_static
-                            })
-                        }
-                        // We don't fold regions in the predicates of opaque
-                        // types to `ReVar`s. This means that in a case like
-                        //
-                        // fn f<'a: 'a>() -> impl Iterator<Item = impl Sized>
-                        //
-                        // The inner opaque type has `'static` in its substs.
-                        ty::ReStatic => region,
-                        _ => {
-                            infcx.tcx.sess.delay_span_bug(
-                                span,
-                                &format!("unexpected concrete region in borrowck: {:?}", region),
-                            );
-                            region
-                        }
-                    });
+                let universal_substs = infcx.tcx.fold_regions(substs, &mut false, |region, _| {
+                    let vid = self.universal_regions.to_region_vid(region);
+                    subst_regions.push(vid);
+                    self.definitions[vid].external_name.unwrap_or_else(|| {
+                        infcx
+                            .tcx
+                            .sess
+                            .delay_span_bug(span, "opaque type with non-universal region substs");
+                        infcx.tcx.lifetimes.re_static
+                    })
+                });
 
                 subst_regions.sort();
                 subst_regions.dedup();
diff --git a/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.rs b/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.rs
deleted file mode 100644
index 967d4c3f0f7..00000000000
--- a/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.rs
+++ /dev/null
@@ -1,33 +0,0 @@
-// failure-status: 101
-// rustc-env:RUST_BACKTRACE=0
-// normalize-stderr-test "note: .*\n\n" -> ""
-// normalize-stderr-test "thread 'rustc' panicked.*\n" -> ""
-
-// compile-flags: --crate-type=rlib
-
-// Regression test for https://github.com/rust-lang/rust/issues/78450
-
-#![feature(min_type_alias_impl_trait)]
-#![no_std]
-
-pub trait AssociatedImpl {
-    type ImplTrait;
-
-    fn f() -> Self::ImplTrait;
-}
-
-struct S<T>(T);
-
-trait Associated {
-    type A;
-}
-
-// ICE
-impl<'a, T: Associated<A = &'a ()>> AssociatedImpl for S<T> {
-    type ImplTrait = impl core::fmt::Debug;
-
-    fn f() -> Self::ImplTrait {
-    //~^ ERROR unexpected concrete region in borrowck: ReEarlyBound(0, 'a)
-        ()
-    }
-}
diff --git a/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.stderr b/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.stderr
deleted file mode 100644
index 64ab7b70b1a..00000000000
--- a/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.stderr
+++ /dev/null
@@ -1,13 +0,0 @@
-error: internal compiler error: unexpected concrete region in borrowck: ReEarlyBound(0, 'a)
-  --> $DIR/associated-type-lifetime-ice.rs:29:5
-   |
-LL | /     fn f() -> Self::ImplTrait {
-LL | |
-LL | |         ()
-LL | |     }
-   | |_____^
-   |
-   = error: internal compiler error: unexpected panic
-
-query stack during panic:
-end of query stack
diff --git a/src/test/ui/type-alias-impl-trait/issue-78450.rs b/src/test/ui/type-alias-impl-trait/issue-78450.rs
new file mode 100644
index 00000000000..640f929f8f1
--- /dev/null
+++ b/src/test/ui/type-alias-impl-trait/issue-78450.rs
@@ -0,0 +1,27 @@
+// check-pass
+
+#![feature(min_type_alias_impl_trait)]
+#![feature(type_alias_impl_trait)]
+//~^ WARNING: the feature `type_alias_impl_trait` is incomplete
+
+pub trait AssociatedImpl {
+    type ImplTrait;
+
+    fn f() -> Self::ImplTrait;
+}
+
+struct S<T>(T);
+
+trait Associated {
+    type A;
+}
+
+impl<'a, T: Associated<A = &'a ()>> AssociatedImpl for S<T> {
+    type ImplTrait = impl core::fmt::Debug;
+
+    fn f() -> Self::ImplTrait {
+        ()
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/type-alias-impl-trait/issue-78450.stderr b/src/test/ui/type-alias-impl-trait/issue-78450.stderr
new file mode 100644
index 00000000000..efccf6241fb
--- /dev/null
+++ b/src/test/ui/type-alias-impl-trait/issue-78450.stderr
@@ -0,0 +1,11 @@
+warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/issue-78450.rs:4:12
+   |
+LL | #![feature(type_alias_impl_trait)]
+   |            ^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: `#[warn(incomplete_features)]` on by default
+   = note: see issue #63063 <https://github.com/rust-lang/rust/issues/63063> for more information
+
+warning: 1 warning emitted
+