about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Kuber <esteban@kuber.com.ar>2021-10-12 09:19:14 +0000
committerEsteban Kuber <esteban@kuber.com.ar>2021-12-10 03:08:23 +0000
commit09dbf37213a5462c08e5e62e931aabc2fb3b92e4 (patch)
tree2c8c8c1a39c990cf61f6087900f1b0676de827b9
parentab45ab83ac0c9b19b6d692ca5d2e9b7b98c3565a (diff)
downloadrust-09dbf37213a5462c08e5e62e931aabc2fb3b92e4.tar.gz
rust-09dbf37213a5462c08e5e62e931aabc2fb3b92e4.zip
Add filtering based on involved required lifetime
More accurate filtering still needed.
-rw-r--r--compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs8
-rw-r--r--compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs29
-rw-r--r--src/test/ui/async-await/issues/issue-62097.stderr7
3 files changed, 21 insertions, 23 deletions
diff --git a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs
index e1f2ec44431..daeb406a839 100644
--- a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs
+++ b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs
@@ -156,11 +156,13 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
         spans.dedup_by_key(|span| (span.lo(), span.hi()));
 
         // We try to make the output have fewer overlapping spans if possible.
-        let (require_msg, require_span) = if sup_origin.span().overlaps(return_sp) {
-            ("...is captured and required to live as long as `'static` here", sup_origin.span())
+        let require_msg = if spans.is_empty() {
+            "...is captured and required to live as long as `'static` here"
         } else {
-            ("...and is required to live as long as `'static` here", return_sp)
+            "...and is required to live as long as `'static` here"
         };
+        let require_span =
+            if sup_origin.span().overlaps(return_sp) { sup_origin.span() } else { return_sp };
 
         for span in &spans {
             err.span_label(*span, "...is captured here...");
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 3d4e96fa0f2..b6c1e1f5922 100644
--- a/compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs
+++ b/compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs
@@ -48,7 +48,7 @@ pub fn resolve<'tcx>(
 
             values.values.iter_mut().for_each(|v| match *v {
                 VarValue::Value(ref mut r) => *r = re_erased,
-                VarValue::ErrorValue => {}
+                VarValue::ErrorValue(_) => {}
             });
             (values, errors)
         }
@@ -69,7 +69,7 @@ pub struct LexicalRegionResolutions<'tcx> {
 #[derive(Copy, Clone, Debug)]
 enum VarValue<'tcx> {
     Value(Region<'tcx>),
-    ErrorValue,
+    ErrorValue(RegionVid),
 }
 
 #[derive(Clone, Debug)]
@@ -233,7 +233,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
                     (None, a_region, b_vid, b_data)
                 }
                 Constraint::VarSubVar(a_vid, b_vid) => match *var_values.value(a_vid) {
-                    VarValue::ErrorValue => continue,
+                    VarValue::ErrorValue(_) => continue,
                     VarValue::Value(a_region) => {
                         let b_data = var_values.value_mut(b_vid);
                         (Some(a_vid), a_region, b_vid, b_data)
@@ -250,7 +250,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
             }
             if let Some(a_vid) = a_vid {
                 match *b_data {
-                    VarValue::Value(ReStatic) | VarValue::ErrorValue => (),
+                    VarValue::Value(ReStatic) | VarValue::ErrorValue(_) => (),
                     _ => {
                         constraints[a_vid].push((a_vid, b_vid));
                         constraints[b_vid].push((a_vid, b_vid));
@@ -262,14 +262,14 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
         while let Some(vid) = changes.pop() {
             constraints[vid].retain(|&(a_vid, b_vid)| {
                 let a_region = match *var_values.value(a_vid) {
-                    VarValue::ErrorValue => return false,
+                    VarValue::ErrorValue(_) => return false,
                     VarValue::Value(a_region) => a_region,
                 };
                 let b_data = var_values.value_mut(b_vid);
                 if self.expand_node(a_region, b_vid, b_data) {
                     changes.push(b_vid);
                 }
-                !matches!(b_data, VarValue::Value(ReStatic) | VarValue::ErrorValue)
+                !matches!(b_data, VarValue::Value(ReStatic) | VarValue::ErrorValue(_))
             });
         }
     }
@@ -332,7 +332,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
                 true
             }
 
-            VarValue::ErrorValue => false,
+            VarValue::ErrorValue(_) => false,
         }
     }
 
@@ -476,7 +476,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
                     debug!("contraction: {:?} == {:?}, {:?}", a_vid, a_data, b_region);
 
                     let a_region = match *a_data {
-                        VarValue::ErrorValue => continue,
+                        VarValue::ErrorValue(_) => continue,
                         VarValue::Value(a_region) => a_region,
                     };
 
@@ -489,7 +489,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
                             cannot verify that {:?}={:?} <= {:?}",
                             origin, a_vid, a_region, b_region
                         );
-                        *a_data = VarValue::ErrorValue;
+                        *a_data = VarValue::ErrorValue(a_vid);
                     }
                 }
             }
@@ -545,7 +545,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
         for (node_vid, value) in var_data.values.iter_enumerated() {
             match *value {
                 VarValue::Value(_) => { /* Inference successful */ }
-                VarValue::ErrorValue => {
+                VarValue::ErrorValue(reg) => {
                     // Inference impossible: this value contains
                     // inconsistent constraints.
                     //
@@ -577,9 +577,10 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
                         .constraints
                         .iter()
                         .filter_map(|(constraint, origin)| match (constraint, origin) {
-                            (Constraint::VarSubVar(_, _), SubregionOrigin::DataBorrowed(_, sp)) => {
-                                Some(*sp)
-                            }
+                            (
+                                Constraint::VarSubVar(_, sup),
+                                SubregionOrigin::DataBorrowed(_, sp),
+                            ) if sup == &reg => Some(*sp),
                             _ => None,
                         })
                         .collect();
@@ -898,7 +899,7 @@ impl<'tcx> LexicalRegionResolutions<'tcx> {
     pub fn resolve_var(&self, rid: RegionVid) -> ty::Region<'tcx> {
         let result = match self.values[rid] {
             VarValue::Value(r) => r,
-            VarValue::ErrorValue => self.error_region,
+            VarValue::ErrorValue(_) => self.error_region,
         };
         debug!("resolve_var({:?}) = {:?}", rid, result);
         result
diff --git a/src/test/ui/async-await/issues/issue-62097.stderr b/src/test/ui/async-await/issues/issue-62097.stderr
index 7aea147c6cf..11fb7c86c3b 100644
--- a/src/test/ui/async-await/issues/issue-62097.stderr
+++ b/src/test/ui/async-await/issues/issue-62097.stderr
@@ -4,13 +4,8 @@ error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'
 LL |     pub async fn run_dummy_fn(&self) {
    |                               ^^^^^ this data with an anonymous lifetime `'_`...
 LL |         foo(|| self.bar()).await;
-   |         ------------------------ ...is captured here...
+   |         --- ...is captured and required to live as long as `'static` here
    |
-note: ...and is required to live as long as `'static` here
-  --> $DIR/issue-62097.rs:13:9
-   |
-LL |         foo(|| self.bar()).await;
-   |         ^^^
 note: `'static` lifetime requirement introduced by this bound
   --> $DIR/issue-62097.rs:4:19
    |