Skip to content

Commit 193a16b

Browse files
committed
Also check anonymous and fresh lifetimes, even if they should never appear in practice
1 parent 1b73e54 commit 193a16b

File tree

1 file changed

+70
-45
lines changed
  • compiler/rustc_ast_lowering/src

1 file changed

+70
-45
lines changed

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 70 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1876,6 +1876,30 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
18761876
res: LifetimeRes,
18771877
itctx: ImplTraitContext<'_, 'hir>,
18781878
) -> hir::Lifetime {
1879+
fn check_impl_trait_lifetimes(
1880+
sess: &Session,
1881+
itctx: ImplTraitContext<'_, '_>,
1882+
span: Span,
1883+
note_span: Option<Span>,
1884+
) {
1885+
match itctx {
1886+
ImplTraitContext::ReturnPositionOpaqueTy { nested: Some(true), .. }
1887+
| ImplTraitContext::TypeAliasesOpaqueTy => {
1888+
let mut err = sess.struct_span_err(
1889+
span,
1890+
"higher kinded lifetime bounds on nested opaque types are not supported yet",
1891+
);
1892+
if let Some(span) = note_span {
1893+
err.span_note(span, "lifetime declared here");
1894+
}
1895+
err.help(
1896+
"See https://github.com/rust-lang/rust/issues/96194 for further details",
1897+
);
1898+
err.emit();
1899+
}
1900+
_ => {}
1901+
}
1902+
}
18791903
debug!(?self.captured_lifetimes);
18801904
let name = match res {
18811905
LifetimeRes::Param { param, binder } => {
@@ -1885,23 +1909,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
18851909
&mut self.captured_lifetimes
18861910
{
18871911
if binders_to_ignore.contains(&binder) {
1888-
match itctx {
1889-
ImplTraitContext::ReturnPositionOpaqueTy {
1890-
nested: Some(true), ..
1891-
}
1892-
| ImplTraitContext::TypeAliasesOpaqueTy => {
1893-
let mut err = self.sess.struct_span_err(
1894-
span,
1895-
"higher kinded lifetime bounds on nested opaque types are not supported yet",
1896-
);
1897-
if let Some(&(span, _, _, _)) = captures.get(&param) {
1898-
err.span_note(span, "lifetime declared here");
1899-
}
1900-
err.help("See https://github.com/rust-lang/rust/issues/96194 for further details");
1901-
err.emit();
1902-
}
1903-
_ => {}
1904-
}
1912+
check_impl_trait_lifetimes(
1913+
self.sess,
1914+
itctx,
1915+
span,
1916+
captures.get(&param).map(|cap| cap.0),
1917+
);
19051918
} else {
19061919
match captures.entry(param) {
19071920
Entry::Occupied(_) => {}
@@ -1926,23 +1939,31 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19261939
debug_assert_eq!(ident.name, kw::UnderscoreLifetime);
19271940
if let Some(LifetimeCaptureContext { parent_def_id, captures, binders_to_ignore }) =
19281941
&mut self.captured_lifetimes
1929-
&& !binders_to_ignore.contains(&binder)
19301942
{
1931-
match captures.entry(param) {
1932-
Entry::Occupied(o) => param = self.resolver.local_def_id(o.get().1),
1933-
Entry::Vacant(v) => {
1934-
let p_id = self.resolver.next_node_id();
1935-
let p_def_id = self.resolver.create_def(
1936-
*parent_def_id,
1937-
p_id,
1938-
DefPathData::LifetimeNs(kw::UnderscoreLifetime),
1939-
ExpnId::root(),
1940-
span.with_parent(None),
1941-
);
1942-
1943-
let p_name = ParamName::Fresh(param);
1944-
v.insert((span, p_id, p_name, res));
1945-
param = p_def_id;
1943+
if binders_to_ignore.contains(&binder) {
1944+
check_impl_trait_lifetimes(
1945+
self.sess,
1946+
itctx,
1947+
span,
1948+
captures.get(&param).map(|cap| cap.0),
1949+
);
1950+
} else {
1951+
match captures.entry(param) {
1952+
Entry::Occupied(o) => param = self.resolver.local_def_id(o.get().1),
1953+
Entry::Vacant(v) => {
1954+
let p_id = self.resolver.next_node_id();
1955+
let p_def_id = self.resolver.create_def(
1956+
*parent_def_id,
1957+
p_id,
1958+
DefPathData::LifetimeNs(kw::UnderscoreLifetime),
1959+
ExpnId::root(),
1960+
span.with_parent(None),
1961+
);
1962+
1963+
let p_name = ParamName::Fresh(param);
1964+
v.insert((span, p_id, p_name, res));
1965+
param = p_def_id;
1966+
}
19461967
}
19471968
}
19481969
}
@@ -1957,19 +1978,23 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19571978
};
19581979
if let Some(LifetimeCaptureContext { parent_def_id, captures, binders_to_ignore }) =
19591980
&mut self.captured_lifetimes
1960-
&& !binders_to_ignore.contains(&binder)
19611981
{
1962-
let p_id = self.resolver.next_node_id();
1963-
let p_def_id = self.resolver.create_def(
1964-
*parent_def_id,
1965-
p_id,
1966-
DefPathData::LifetimeNs(kw::UnderscoreLifetime),
1967-
ExpnId::root(),
1968-
span.with_parent(None),
1969-
);
1970-
let p_name = ParamName::Fresh(p_def_id);
1971-
captures.insert(p_def_id, (span, p_id, p_name, res));
1972-
hir::LifetimeName::Param(p_name)
1982+
if binders_to_ignore.contains(&binder) {
1983+
check_impl_trait_lifetimes(self.sess, itctx, span, None);
1984+
l_name
1985+
} else {
1986+
let p_id = self.resolver.next_node_id();
1987+
let p_def_id = self.resolver.create_def(
1988+
*parent_def_id,
1989+
p_id,
1990+
DefPathData::LifetimeNs(kw::UnderscoreLifetime),
1991+
ExpnId::root(),
1992+
span.with_parent(None),
1993+
);
1994+
let p_name = ParamName::Fresh(p_def_id);
1995+
captures.insert(p_def_id, (span, p_id, p_name, res));
1996+
hir::LifetimeName::Param(p_name)
1997+
}
19731998
} else {
19741999
l_name
19752000
}

0 commit comments

Comments
 (0)