Skip to content

Commit 18e5453

Browse files
committed
use ParamName to track in-scope lifetimes instead of Ident
This allows us to record "fresh" lifetime names for cases like `impl Foo<'_>`.
1 parent 60960a2 commit 18e5453

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

src/librustc/hir/lowering.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ pub struct LoweringContext<'a> {
136136
/// When `is_collectin_in_band_lifetimes` is true, each lifetime is checked
137137
/// against this list to see if it is already in-scope, or if a definition
138138
/// needs to be created for it.
139-
in_scope_lifetimes: Vec<Ident>,
139+
in_scope_lifetimes: Vec<ParamName>,
140140

141141
current_module: NodeId,
142142

@@ -865,7 +865,7 @@ impl<'a> LoweringContext<'a> {
865865
return;
866866
}
867867

868-
if self.in_scope_lifetimes.contains(&ident.modern()) {
868+
if self.in_scope_lifetimes.contains(&ParamName::Plain(ident.modern())) {
869869
return;
870870
}
871871

@@ -899,7 +899,7 @@ impl<'a> LoweringContext<'a> {
899899
{
900900
let old_len = self.in_scope_lifetimes.len();
901901
let lt_def_names = params.iter().filter_map(|param| match param.kind {
902-
GenericParamKind::Lifetime { .. } => Some(param.ident.modern()),
902+
GenericParamKind::Lifetime { .. } => Some(ParamName::Plain(param.ident.modern())),
903903
_ => None,
904904
});
905905
self.in_scope_lifetimes.extend(lt_def_names);
@@ -2267,10 +2267,14 @@ impl<'a> LoweringContext<'a> {
22672267
let lifetime_params: Vec<(Span, ParamName)> =
22682268
this.in_scope_lifetimes
22692269
.iter().cloned()
2270-
.map(|ident| (ident.span, ParamName::Plain(ident)))
2270+
.map(|name| (name.ident().span, name))
22712271
.chain(this.lifetimes_to_define.iter().cloned())
22722272
.collect();
22732273

2274+
debug!("lower_async_fn_ret_ty: in_scope_lifetimes={:#?}", this.in_scope_lifetimes);
2275+
debug!("lower_async_fn_ret_ty: lifetimes_to_define={:#?}", this.lifetimes_to_define);
2276+
debug!("lower_async_fn_ret_ty: lifetime_params={:#?}", lifetime_params);
2277+
22742278
let generic_params =
22752279
lifetime_params
22762280
.iter().cloned()

src/librustc/hir/lowering/item.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ impl LoweringContext<'_> {
123123
_ => &[],
124124
};
125125
let lt_def_names = parent_generics.iter().filter_map(|param| match param.kind {
126-
hir::GenericParamKind::Lifetime { .. } => Some(param.name.ident().modern()),
126+
hir::GenericParamKind::Lifetime { .. } => Some(param.name),
127127
_ => None,
128128
});
129129
self.in_scope_lifetimes.extend(lt_def_names);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Check that `async fn` inside of an impl with `'_`
2+
// in the header compiles correctly.
3+
//
4+
// Regression test for #63500.
5+
//
6+
// check-pass
7+
8+
#![feature(async_await)]
9+
10+
struct Foo<'a>(&'a u8);
11+
12+
impl Foo<'_> {
13+
async fn bar() {}
14+
}
15+
16+
fn main() { }

0 commit comments

Comments
 (0)