about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2022-06-23 16:53:44 -0400
committerNiko Matsakis <niko@alum.mit.edu>2022-06-23 17:00:28 -0400
commitc3137d9e8c6cf28565e533f669e4cf4a1a3378ee (patch)
tree714efbef4fa7efa956abedd8c6ff4bf96cbc165d
parente6b630c5b178cb19b2453cac9d7b342d6d676def (diff)
downloadrust-c3137d9e8c6cf28565e533f669e4cf4a1a3378ee.tar.gz
rust-c3137d9e8c6cf28565e533f669e4cf4a1a3378ee.zip
normalize if-eq bounds before testing
Hat-tip: aliemjay
-rw-r--r--compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs3
-rw-r--r--src/test/ui/nll/vimwiki-core-regression.rs37
2 files changed, 39 insertions, 1 deletions
diff --git a/compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs b/compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs
index 9fa374a53fc..455de47acef 100644
--- a/compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs
+++ b/compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs
@@ -823,10 +823,11 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
     ) -> bool {
         match bound {
             VerifyBound::IfEq(verify_if_eq_b) => {
+                let verify_if_eq_b = var_values.normalize(self.region_rels.tcx, *verify_if_eq_b);
                 match test_type_match::extract_verify_if_eq(
                     self.tcx(),
                     self.param_env,
-                    verify_if_eq_b,
+                    &verify_if_eq_b,
                     generic_ty,
                 ) {
                     Some(r) => {
diff --git a/src/test/ui/nll/vimwiki-core-regression.rs b/src/test/ui/nll/vimwiki-core-regression.rs
new file mode 100644
index 00000000000..0a4ed7e0a40
--- /dev/null
+++ b/src/test/ui/nll/vimwiki-core-regression.rs
@@ -0,0 +1,37 @@
+// check-pass
+//
+// Regression test from crater run for
+// <https://github.com/rust-lang/rust/pull/98109>.
+
+
+pub trait ElementLike {}
+
+pub struct Located<T> where T: ElementLike {
+    inner: T,
+}
+
+pub struct BlockElement<'a>(&'a str);
+
+impl ElementLike for BlockElement<'_> {}
+
+
+pub struct Page<'a> {
+    /// Comprised of the elements within a page
+    pub elements: Vec<Located<BlockElement<'a>>>,
+}
+
+impl<'a, __IdxT> std::ops::Index<__IdxT> for Page<'a> where
+    Vec<Located<BlockElement<'a>>>: std::ops::Index<__IdxT>
+{
+    type Output =
+        <Vec<Located<BlockElement<'a>>> as
+        std::ops::Index<__IdxT>>::Output;
+
+    #[inline]
+    fn index(&self, idx: __IdxT) -> &Self::Output {
+        <Vec<Located<BlockElement<'a>>> as
+                std::ops::Index<__IdxT>>::index(&self.elements, idx)
+    }
+}
+
+fn main() {}