Skip to content

Commit dd28f96

Browse files
committed
Handle allow(elided_lifetimes_in_paths).
1 parent 8609dc4 commit dd28f96

File tree

4 files changed

+45
-32
lines changed

4 files changed

+45
-32
lines changed

compiler/rustc_resolve/src/late/diagnostics.rs

+28-31
Original file line numberDiff line numberDiff line change
@@ -1950,38 +1950,35 @@ impl<'tcx> LifetimeContext<'_, 'tcx> {
19501950
}
19511951

19521952
crate fn report_elided_lifetime_in_ty(&self, lifetime_refs: &[&hir::Lifetime]) {
1953-
let missing_lifetimes = lifetime_refs
1954-
.iter()
1955-
.filter(|a| matches!(a, hir::Lifetime { name: hir::LifetimeName::ImplicitMissing, .. }))
1956-
.count();
1957-
1958-
if missing_lifetimes > 0 {
1959-
let mut spans: Vec<_> = lifetime_refs.iter().map(|lt| lt.span).collect();
1960-
spans.sort();
1961-
let mut spans_dedup = spans.clone();
1962-
spans_dedup.dedup();
1963-
let spans_with_counts: Vec<_> = spans_dedup
1964-
.into_iter()
1965-
.map(|sp| (sp, spans.iter().filter(|nsp| *nsp == &sp).count()))
1966-
.collect();
1953+
let Some(missing_lifetime) = lifetime_refs.iter().find(|lt| {
1954+
lt.name == hir::LifetimeName::ImplicitMissing
1955+
}) else { return };
1956+
1957+
let mut spans: Vec<_> = lifetime_refs.iter().map(|lt| lt.span).collect();
1958+
spans.sort();
1959+
let mut spans_dedup = spans.clone();
1960+
spans_dedup.dedup();
1961+
let spans_with_counts: Vec<_> = spans_dedup
1962+
.into_iter()
1963+
.map(|sp| (sp, spans.iter().filter(|nsp| *nsp == &sp).count()))
1964+
.collect();
19671965

1968-
self.tcx.struct_span_lint_hir(
1969-
rustc_session::lint::builtin::ELIDED_LIFETIMES_IN_PATHS,
1970-
hir::CRATE_HIR_ID,
1971-
spans,
1972-
|lint| {
1973-
let mut db = lint.build("hidden lifetime parameters in types are deprecated");
1974-
self.add_missing_lifetime_specifiers_label(
1975-
&mut db,
1976-
spans_with_counts,
1977-
&FxHashSet::from_iter([kw::UnderscoreLifetime]),
1978-
Vec::new(),
1979-
&[],
1980-
);
1981-
db.emit()
1982-
},
1983-
);
1984-
}
1966+
self.tcx.struct_span_lint_hir(
1967+
rustc_session::lint::builtin::ELIDED_LIFETIMES_IN_PATHS,
1968+
missing_lifetime.hir_id,
1969+
spans,
1970+
|lint| {
1971+
let mut db = lint.build("hidden lifetime parameters in types are deprecated");
1972+
self.add_missing_lifetime_specifiers_label(
1973+
&mut db,
1974+
spans_with_counts,
1975+
&FxHashSet::from_iter([kw::UnderscoreLifetime]),
1976+
Vec::new(),
1977+
&[],
1978+
);
1979+
db.emit()
1980+
},
1981+
);
19851982
}
19861983

19871984
// FIXME(const_generics): This patches over an ICE caused by non-'static lifetimes in const

src/test/ui/in-band-lifetimes/elided-lifetimes.fixed

+8
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ macro_rules! anytuple_ref_ty {
9696
}
9797
}
9898

99+
#[allow(elided_lifetimes_in_paths)]
100+
mod blah {
101+
struct Thing<'a>(&'a i32);
102+
struct Bar<T>(T);
103+
104+
fn foo(b: Bar<Thing>) {}
105+
}
106+
99107
fn main() {
100108
let honesty = RefCell::new((4, 'e'));
101109
let loyalty: Ref<'_, (u32, char)> = honesty.borrow();

src/test/ui/in-band-lifetimes/elided-lifetimes.rs

+8
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ macro_rules! anytuple_ref_ty {
9696
}
9797
}
9898

99+
#[allow(elided_lifetimes_in_paths)]
100+
mod blah {
101+
struct Thing<'a>(&'a i32);
102+
struct Bar<T>(T);
103+
104+
fn foo(b: Bar<Thing>) {}
105+
}
106+
99107
fn main() {
100108
let honesty = RefCell::new((4, 'e'));
101109
let loyalty: Ref<(u32, char)> = honesty.borrow();

src/test/ui/in-band-lifetimes/elided-lifetimes.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ LL | fn $fn_name(gift: &str) -> $type_name<'_> {
9090
| ~~~~~~~~~~~~~~
9191

9292
error: hidden lifetime parameters in types are deprecated
93-
--> $DIR/elided-lifetimes.rs:101:22
93+
--> $DIR/elided-lifetimes.rs:109:22
9494
|
9595
LL | let loyalty: Ref<(u32, char)> = honesty.borrow();
9696
| ^ expected named lifetime parameter

0 commit comments

Comments
 (0)