]> git.lizzy.rs Git - rust.git/commitdiff
Remove the distinction between LifetimeName::Implicit and LifetimeName::Underscore.
authorCamille GILLOT <gillot.camille@gmail.com>
Sun, 22 May 2022 08:22:20 +0000 (10:22 +0200)
committerCamille GILLOT <gillot.camille@gmail.com>
Tue, 26 Jul 2022 17:00:31 +0000 (19:00 +0200)
compiler/rustc_ast_lowering/src/lib.rs
compiler/rustc_borrowck/src/diagnostics/region_name.rs
compiler/rustc_hir/src/def.rs
compiler/rustc_hir/src/hir.rs
compiler/rustc_hir/src/intravisit.rs
compiler/rustc_resolve/src/late.rs
compiler/rustc_resolve/src/late/lifetimes.rs

index d4b41aad08ca4ba6e839168eb05e7bd15d2f6062..a031480611641eab2614608de835b2f9f9102df3 100644 (file)
@@ -1883,7 +1883,7 @@ fn new_named_lifetime_with_res(
                 }
                 hir::LifetimeName::Param(param, ParamName::Fresh)
             }
-            LifetimeRes::Anonymous { binder, elided } => {
+            LifetimeRes::Anonymous { binder } => {
                 let mut l_name = None;
                 if let Some(mut captured_lifetimes) = self.captured_lifetimes.take() {
                     if !captured_lifetimes.binders_to_ignore.contains(&binder) {
@@ -1900,11 +1900,7 @@ fn new_named_lifetime_with_res(
                     }
                     self.captured_lifetimes = Some(captured_lifetimes);
                 };
-                l_name.unwrap_or(if elided {
-                    hir::LifetimeName::Implicit
-                } else {
-                    hir::LifetimeName::Underscore
-                })
+                l_name.unwrap_or(hir::LifetimeName::Underscore)
             }
             LifetimeRes::Static => hir::LifetimeName::Static,
             LifetimeRes::Error => hir::LifetimeName::Error,
index 4cf1ac4d7abc0ca28cf3f9f327eac9d4eaac0746..8ba76979c39c66aaadfc36ab391828b1d00e0c5e 100644 (file)
@@ -589,7 +589,6 @@ fn match_adt_and_segment<'hir>(
 
             hir::LifetimeName::Param(_, hir::ParamName::Fresh)
             | hir::LifetimeName::ImplicitObjectLifetimeDefault
-            | hir::LifetimeName::Implicit
             | hir::LifetimeName::Underscore => {
                 // In this case, the user left off the lifetime; so
                 // they wrote something like:
index c0d5d2bc46d0d31988583e85663e15cbf2fe32ae..2003d70835c6f2e811fa2730ac86a5ad76b1ab71 100644 (file)
@@ -742,8 +742,6 @@ pub enum LifetimeRes {
     Anonymous {
         /// Id of the introducing place. See `Param`.
         binder: NodeId,
-        /// Whether this lifetime was spelled or elided.
-        elided: bool,
     },
     /// Explicit `'static` lifetime.
     Static,
index 18ffc227fed869e71de9fb50df4482263b38ffa4..7a0bf265fafdb3aeef8abbbe7be84288c8a350b7 100644 (file)
@@ -90,9 +90,6 @@ pub enum LifetimeName {
     /// User-given names or fresh (synthetic) names.
     Param(LocalDefId, ParamName),
 
-    /// User wrote nothing (e.g., the lifetime in `&u32`).
-    Implicit,
-
     /// Implicit lifetime in a context like `dyn Foo`. This is
     /// distinguished from implicit lifetimes elsewhere because the
     /// lifetime that they default to must appear elsewhere within the
@@ -110,7 +107,7 @@ pub enum LifetimeName {
     /// that was already reported.
     Error,
 
-    /// User wrote specifies `'_`.
+    /// User wrote an anonymous lifetime, either `'_` or nothing.
     Underscore,
 
     /// User wrote `'static`.
@@ -120,9 +117,7 @@ pub enum LifetimeName {
 impl LifetimeName {
     pub fn ident(&self) -> Ident {
         match *self {
-            LifetimeName::ImplicitObjectLifetimeDefault
-            | LifetimeName::Implicit
-            | LifetimeName::Error => Ident::empty(),
+            LifetimeName::ImplicitObjectLifetimeDefault | LifetimeName::Error => Ident::empty(),
             LifetimeName::Underscore => Ident::with_dummy_span(kw::UnderscoreLifetime),
             LifetimeName::Static => Ident::with_dummy_span(kw::StaticLifetime),
             LifetimeName::Param(_, param_name) => param_name.ident(),
@@ -132,7 +127,6 @@ pub fn ident(&self) -> Ident {
     pub fn is_anonymous(&self) -> bool {
         match *self {
             LifetimeName::ImplicitObjectLifetimeDefault
-            | LifetimeName::Implicit
             | LifetimeName::Underscore
             | LifetimeName::Param(_, ParamName::Fresh)
             | LifetimeName::Error => true,
@@ -142,9 +136,7 @@ pub fn is_anonymous(&self) -> bool {
 
     pub fn is_elided(&self) -> bool {
         match self {
-            LifetimeName::ImplicitObjectLifetimeDefault
-            | LifetimeName::Implicit
-            | LifetimeName::Underscore => true,
+            LifetimeName::ImplicitObjectLifetimeDefault | LifetimeName::Underscore => true,
 
             // It might seem surprising that `Fresh` counts as
             // *not* elided -- but this is because, as far as the code
index d00b65da7e6a5418eda8363542c29b8dc146d6a6..b1d8c616fb81df49e8008933e59165f3335c9f00 100644 (file)
@@ -496,7 +496,6 @@ pub fn walk_lifetime<'v, V: Visitor<'v>>(visitor: &mut V, lifetime: &'v Lifetime
         | LifetimeName::Param(_, ParamName::Error)
         | LifetimeName::Static
         | LifetimeName::Error
-        | LifetimeName::Implicit
         | LifetimeName::ImplicitObjectLifetimeDefault
         | LifetimeName::Underscore => {}
     }
index bc5668bcec00fc64dda20a7d0219b41ae7fb81af..a12495c51ad7c94c49e8a062341a604fb95129df 100644 (file)
@@ -262,9 +262,6 @@ enum LifetimeRibKind {
     /// error on default object bounds (e.g., `Box<dyn Foo>`).
     AnonymousReportError,
 
-    /// Pass responsibility to `resolve_lifetime` code for all cases.
-    AnonymousPassThrough(NodeId),
-
     /// Replace all anonymous lifetimes by provided lifetime.
     Elided(LifetimeRes),
 
@@ -868,7 +865,7 @@ fn visit_fn(&mut self, fn_kind: FnKind<'ast>, sp: Span, fn_id: NodeId) {
                             let previous_state = replace(&mut this.in_func_body, true);
                             // Resolve the function body, potentially inside the body of an async closure
                             this.with_lifetime_rib(
-                                LifetimeRibKind::AnonymousPassThrough(fn_id),
+                                LifetimeRibKind::Elided(LifetimeRes::Anonymous { binder: fn_id }),
                                 |this| this.visit_block(body),
                             );
 
@@ -896,7 +893,9 @@ fn visit_fn(&mut self, fn_kind: FnKind<'ast>, sp: Span, fn_id: NodeId) {
                         this.with_lifetime_rib(
                             match binder {
                                 ClosureBinder::NotPresent => {
-                                    LifetimeRibKind::AnonymousPassThrough(fn_id)
+                                    LifetimeRibKind::Elided(LifetimeRes::Anonymous {
+                                        binder: fn_id,
+                                    })
                                 }
                                 ClosureBinder::For { .. } => LifetimeRibKind::AnonymousReportError,
                             },
@@ -908,7 +907,7 @@ fn visit_fn(&mut self, fn_kind: FnKind<'ast>, sp: Span, fn_id: NodeId) {
                         let previous_state = replace(&mut this.in_func_body, true);
                         // Resolve the function body, potentially inside the body of an async closure
                         this.with_lifetime_rib(
-                            LifetimeRibKind::AnonymousPassThrough(fn_id),
+                            LifetimeRibKind::Elided(LifetimeRes::Anonymous { binder: fn_id }),
                             |this| this.visit_expr(body),
                         );
 
@@ -1053,8 +1052,7 @@ fn visit_path_segment(&mut self, path_span: Span, path_segment: &'ast PathSegmen
                                 visit::walk_generic_args(self, path_span, args);
                                 break;
                             }
-                            LifetimeRibKind::AnonymousPassThrough(..)
-                            | LifetimeRibKind::AnonymousCreateParameter { .. }
+                            LifetimeRibKind::AnonymousCreateParameter { .. }
                             | LifetimeRibKind::AnonymousReportError
                             | LifetimeRibKind::Elided(_)
                             | LifetimeRibKind::ElisionFailure
@@ -1415,8 +1413,7 @@ fn resolve_lifetime(&mut self, lifetime: &'ast Lifetime, use_ctxt: visit::Lifeti
                                     | LifetimeRibKind::AnonymousReportError
                                     | LifetimeRibKind::ElisionFailure => Some(LifetimeUseSet::Many),
                                     // An anonymous lifetime is legal here, go ahead.
-                                    LifetimeRibKind::AnonymousPassThrough(_)
-                                    | LifetimeRibKind::AnonymousCreateParameter { .. } => {
+                                    LifetimeRibKind::AnonymousCreateParameter { .. } => {
                                         Some(LifetimeUseSet::One { use_span: ident.span, use_ctxt })
                                     }
                                     // Only report if eliding the lifetime would have the same
@@ -1527,14 +1524,6 @@ fn resolve_anonymous_lifetime(&mut self, lifetime: &Lifetime, elided: bool) {
                     self.record_lifetime_res(lifetime.id, LifetimeRes::Error, elision_candidate);
                     return;
                 }
-                LifetimeRibKind::AnonymousPassThrough(node_id) => {
-                    self.record_lifetime_res(
-                        lifetime.id,
-                        LifetimeRes::Anonymous { binder: node_id, elided },
-                        elision_candidate,
-                    );
-                    return;
-                }
                 LifetimeRibKind::Elided(res) => {
                     self.record_lifetime_res(lifetime.id, res, elision_candidate);
                     return;
@@ -1658,8 +1647,7 @@ fn resolve_elided_lifetimes_in_path(
                 // Do not create a parameter for patterns and expressions.
                 for rib in self.lifetime_ribs.iter().rev() {
                     match rib.kind {
-                        LifetimeRibKind::AnonymousPassThrough(binder) => {
-                            let res = LifetimeRes::Anonymous { binder, elided: true };
+                        LifetimeRibKind::Elided(res @ LifetimeRes::Anonymous { .. }) => {
                             for id in node_ids {
                                 self.record_lifetime_res(id, res, LifetimeElisionCandidate::Named);
                             }
@@ -1673,8 +1661,7 @@ fn resolve_elided_lifetimes_in_path(
                             // FIXME(cjgillot) This resolution is wrong, but this does not matter
                             // since these cases are erroneous anyway.  Lifetime resolution should
                             // emit a "missing lifetime specifier" diagnostic.
-                            let res =
-                                LifetimeRes::Anonymous { binder: DUMMY_NODE_ID, elided: true };
+                            let res = LifetimeRes::Anonymous { binder: DUMMY_NODE_ID };
                             for id in node_ids {
                                 self.record_lifetime_res(id, res, LifetimeElisionCandidate::Named);
                             }
@@ -1753,19 +1740,6 @@ fn resolve_elided_lifetimes_in_path(
                         }
                         break;
                     }
-                    // `PassThrough` is the normal case.
-                    LifetimeRibKind::AnonymousPassThrough(binder) => {
-                        let res = LifetimeRes::Anonymous { binder, elided: true };
-                        let mut candidate = LifetimeElisionCandidate::Missing(missing_lifetime);
-                        for id in node_ids {
-                            self.record_lifetime_res(
-                                id,
-                                res,
-                                replace(&mut candidate, LifetimeElisionCandidate::Ignore),
-                            );
-                        }
-                        break;
-                    }
                     LifetimeRibKind::Elided(res) => {
                         let mut candidate = LifetimeElisionCandidate::Missing(missing_lifetime);
                         for id in node_ids {
@@ -2272,7 +2246,7 @@ fn resolve_item(&mut self, item: &'ast Item) {
                         this.visit_ty(ty);
                     });
                     this.with_lifetime_rib(
-                        LifetimeRibKind::AnonymousPassThrough(item.id),
+                        LifetimeRibKind::Elided(LifetimeRes::Anonymous { binder: item.id }),
                         |this| {
                             if let Some(expr) = expr {
                                 let constant_item_kind = match item.kind {
@@ -2547,7 +2521,7 @@ fn resolve_trait_items(&mut self, trait_items: &'ast [P<AssocItem>]) {
                         // Type parameters can already be used and as associated consts are
                         // not used as part of the type system, this is far less surprising.
                         self.with_lifetime_rib(
-                            LifetimeRibKind::AnonymousPassThrough(item.id),
+                            LifetimeRibKind::Elided(LifetimeRes::Anonymous { binder: item.id }),
                             |this| {
                                 this.with_constant_rib(
                                     IsRepeatExpr::No,
@@ -2721,7 +2695,7 @@ fn resolve_impl_item(&mut self, item: &'ast AssocItem) {
                     // Type parameters can already be used and as associated consts are
                     // not used as part of the type system, this is far less surprising.
                     self.with_lifetime_rib(
-                        LifetimeRibKind::AnonymousPassThrough(item.id),
+                        LifetimeRibKind::Elided(LifetimeRes::Anonymous { binder: item.id }),
                         |this| {
                             this.with_constant_rib(
                                 IsRepeatExpr::No,
index a7fd7c427c759402444e127ccec7648c2a7bafc2..e9cbbedc7b0b2211d766dc52eaf8a7d239b34d4b 100644 (file)
@@ -819,7 +819,7 @@ fn visit_ty(&mut self, ty: &'tcx hir::Ty<'tcx>) {
                         // `Box<dyn Debug + 'static>`.
                         self.resolve_object_lifetime_default(lifetime)
                     }
-                    LifetimeName::Implicit | LifetimeName::Underscore => {
+                    LifetimeName::Underscore => {
                         // If the user writes `'_`, we use the *ordinary* elision
                         // rules. So the `'_` in e.g., `Box<dyn Debug + '_>` will be
                         // resolved the same as the `'_` in `&'_ Foo`.
@@ -1135,9 +1135,9 @@ fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) {
     #[tracing::instrument(level = "debug", skip(self))]
     fn visit_lifetime(&mut self, lifetime_ref: &'tcx hir::Lifetime) {
         match lifetime_ref.name {
-            hir::LifetimeName::ImplicitObjectLifetimeDefault
-            | hir::LifetimeName::Implicit
-            | hir::LifetimeName::Underscore => self.resolve_elided_lifetimes(&[lifetime_ref]),
+            hir::LifetimeName::ImplicitObjectLifetimeDefault | hir::LifetimeName::Underscore => {
+                self.resolve_elided_lifetimes(&[lifetime_ref])
+            }
             hir::LifetimeName::Static => self.insert_lifetime(lifetime_ref, Region::Static),
             hir::LifetimeName::Param(param_def_id, _) => {
                 self.resolve_lifetime_ref(param_def_id, lifetime_ref)