Merge Implicit and ImplicitMissing.
This commit is contained in:
parent
72dc29c260
commit
aa2450f41b
6 changed files with 19 additions and 36 deletions
|
@ -1786,7 +1786,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
GenericArg::Lifetime(hir::Lifetime {
|
||||
hir_id: self.next_id(),
|
||||
span: self.lower_span(span),
|
||||
name: hir::LifetimeName::Implicit,
|
||||
name: hir::LifetimeName::Implicit(false),
|
||||
})));
|
||||
let generic_args = self.arena.alloc_from_iter(generic_args);
|
||||
|
||||
|
@ -1927,8 +1927,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
});
|
||||
let param_name = match lt.name {
|
||||
hir::LifetimeName::Param(param_name) => param_name,
|
||||
hir::LifetimeName::Implicit
|
||||
| hir::LifetimeName::ImplicitMissing
|
||||
hir::LifetimeName::Implicit(_)
|
||||
| hir::LifetimeName::Underscore
|
||||
| hir::LifetimeName::Static => hir::ParamName::Plain(lt.name.ident()),
|
||||
hir::LifetimeName::ImplicitObjectLifetimeDefault => {
|
||||
|
@ -2291,7 +2290,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
|
||||
AnonymousLifetimeMode::ReportError => self.new_error_lifetime(None, span),
|
||||
|
||||
AnonymousLifetimeMode::PassThrough => self.new_implicit_lifetime(span),
|
||||
AnonymousLifetimeMode::PassThrough => self.new_implicit_lifetime(span, false),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2344,12 +2343,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
// lifetime. Instead, we simply create an implicit lifetime, which will be checked
|
||||
// later, at which point a suitable error will be emitted.
|
||||
AnonymousLifetimeMode::PassThrough | AnonymousLifetimeMode::ReportError => {
|
||||
if param_mode == ParamMode::Explicit {
|
||||
let id = self.resolver.next_node_id();
|
||||
self.new_named_lifetime(id, span, hir::LifetimeName::ImplicitMissing)
|
||||
} else {
|
||||
self.new_implicit_lifetime(span)
|
||||
}
|
||||
self.new_implicit_lifetime(span, param_mode == ParamMode::Explicit)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2392,11 +2386,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
r
|
||||
}
|
||||
|
||||
fn new_implicit_lifetime(&mut self, span: Span) -> hir::Lifetime {
|
||||
fn new_implicit_lifetime(&mut self, span: Span, missing: bool) -> hir::Lifetime {
|
||||
hir::Lifetime {
|
||||
hir_id: self.next_id(),
|
||||
span: self.lower_span(span),
|
||||
name: hir::LifetimeName::Implicit,
|
||||
name: hir::LifetimeName::Implicit(missing),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2543,9 +2537,7 @@ fn lifetimes_from_impl_trait_bounds(
|
|||
|
||||
fn visit_lifetime(&mut self, lifetime: &'v hir::Lifetime) {
|
||||
let name = match lifetime.name {
|
||||
hir::LifetimeName::Implicit
|
||||
| hir::LifetimeName::ImplicitMissing
|
||||
| hir::LifetimeName::Underscore => {
|
||||
hir::LifetimeName::Implicit(_) | hir::LifetimeName::Underscore => {
|
||||
if self.collect_elided_lifetimes {
|
||||
// Use `'_` for both implicit and underscore lifetimes in
|
||||
// `type Foo<'_> = impl SomeTrait<'_>;`.
|
||||
|
|
|
@ -584,9 +584,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
|||
Some(RegionNameHighlight::MatchedAdtAndSegment(lifetime_span))
|
||||
}
|
||||
|
||||
hir::LifetimeName::ImplicitObjectLifetimeDefault
|
||||
| hir::LifetimeName::Implicit
|
||||
| hir::LifetimeName::ImplicitMissing => {
|
||||
hir::LifetimeName::ImplicitObjectLifetimeDefault | hir::LifetimeName::Implicit(_) => {
|
||||
// In this case, the user left off the lifetime; so
|
||||
// they wrote something like:
|
||||
//
|
||||
|
|
|
@ -92,10 +92,9 @@ pub enum LifetimeName {
|
|||
Param(ParamName),
|
||||
|
||||
/// User wrote nothing (e.g., the lifetime in `&u32`).
|
||||
Implicit,
|
||||
|
||||
/// User wrote nothing, but should have provided something.
|
||||
ImplicitMissing,
|
||||
///
|
||||
/// The bool indicates whether the user should have written something.
|
||||
Implicit(bool),
|
||||
|
||||
/// Implicit lifetime in a context like `dyn Foo`. This is
|
||||
/// distinguished from implicit lifetimes elsewhere because the
|
||||
|
@ -125,8 +124,7 @@ impl LifetimeName {
|
|||
pub fn ident(&self) -> Ident {
|
||||
match *self {
|
||||
LifetimeName::ImplicitObjectLifetimeDefault
|
||||
| LifetimeName::Implicit
|
||||
| LifetimeName::ImplicitMissing
|
||||
| LifetimeName::Implicit(_)
|
||||
| LifetimeName::Error => Ident::empty(),
|
||||
LifetimeName::Underscore => Ident::with_dummy_span(kw::UnderscoreLifetime),
|
||||
LifetimeName::Static => Ident::with_dummy_span(kw::StaticLifetime),
|
||||
|
@ -137,8 +135,7 @@ impl LifetimeName {
|
|||
pub fn is_elided(&self) -> bool {
|
||||
match self {
|
||||
LifetimeName::ImplicitObjectLifetimeDefault
|
||||
| LifetimeName::Implicit
|
||||
| LifetimeName::ImplicitMissing
|
||||
| LifetimeName::Implicit(_)
|
||||
| LifetimeName::Underscore => true,
|
||||
|
||||
// It might seem surprising that `Fresh(_)` counts as
|
||||
|
@ -3303,7 +3300,7 @@ mod size_asserts {
|
|||
rustc_data_structures::static_assert_size!(super::Expr<'static>, 64);
|
||||
rustc_data_structures::static_assert_size!(super::Pat<'static>, 88);
|
||||
rustc_data_structures::static_assert_size!(super::QPath<'static>, 24);
|
||||
rustc_data_structures::static_assert_size!(super::Ty<'static>, 72);
|
||||
rustc_data_structures::static_assert_size!(super::Ty<'static>, 80);
|
||||
|
||||
rustc_data_structures::static_assert_size!(super::Item<'static>, 184);
|
||||
rustc_data_structures::static_assert_size!(super::TraitItem<'static>, 128);
|
||||
|
|
|
@ -545,8 +545,7 @@ 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::ImplicitMissing
|
||||
| LifetimeName::Implicit(_)
|
||||
| LifetimeName::ImplicitObjectLifetimeDefault
|
||||
| LifetimeName::Underscore => {}
|
||||
}
|
||||
|
|
|
@ -1952,7 +1952,7 @@ impl<'tcx> LifetimeContext<'_, 'tcx> {
|
|||
|
||||
crate fn report_elided_lifetime_in_ty(&self, lifetime_refs: &[&hir::Lifetime]) {
|
||||
let Some(missing_lifetime) = lifetime_refs.iter().find(|lt| {
|
||||
lt.name == hir::LifetimeName::ImplicitMissing
|
||||
lt.name == hir::LifetimeName::Implicit(true)
|
||||
}) else { return };
|
||||
|
||||
let mut spans: Vec<_> = lifetime_refs.iter().map(|lt| lt.span).collect();
|
||||
|
@ -2408,8 +2408,7 @@ impl<'tcx> LifetimeContext<'_, 'tcx> {
|
|||
);
|
||||
let is_allowed_lifetime = matches!(
|
||||
lifetime_ref.name,
|
||||
hir::LifetimeName::Implicit
|
||||
| hir::LifetimeName::ImplicitMissing
|
||||
hir::LifetimeName::Implicit(_)
|
||||
| hir::LifetimeName::Static
|
||||
| hir::LifetimeName::Underscore
|
||||
);
|
||||
|
|
|
@ -923,7 +923,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
|
|||
}
|
||||
});
|
||||
match lifetime.name {
|
||||
LifetimeName::Implicit | hir::LifetimeName::ImplicitMissing => {
|
||||
LifetimeName::Implicit(_) => {
|
||||
// For types like `dyn Foo`, we should
|
||||
// generate a special form of elided.
|
||||
span_bug!(ty.span, "object-lifetime-default expected, not implicit",);
|
||||
|
@ -3282,9 +3282,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
|||
))
|
||||
.emit();
|
||||
}
|
||||
hir::LifetimeName::Param(_)
|
||||
| hir::LifetimeName::Implicit
|
||||
| hir::LifetimeName::ImplicitMissing => {
|
||||
hir::LifetimeName::Param(_) | hir::LifetimeName::Implicit(_) => {
|
||||
self.resolve_lifetime_ref(lt);
|
||||
}
|
||||
hir::LifetimeName::ImplicitObjectLifetimeDefault => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue