Rollup merge of #110984 - cjgillot:const-infer-lifetime, r=compiler-errors

Do not resolve anonymous lifetimes in consts to be static.

Fixes https://github.com/rust-lang/rust/issues/110931
This commit is contained in:
Matthias Krüger 2023-04-30 01:14:59 +02:00 committed by GitHub
commit a656a2019a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 2 deletions

View file

@ -656,7 +656,7 @@ fn visit_block(&mut self, block: &'ast Block) {
fn visit_anon_const(&mut self, constant: &'ast AnonConst) {
// We deal with repeat expressions explicitly in `resolve_expr`.
self.with_lifetime_rib(LifetimeRibKind::AnonConst, |this| {
this.with_lifetime_rib(LifetimeRibKind::Elided(LifetimeRes::Static), |this| {
this.with_lifetime_rib(LifetimeRibKind::Elided(LifetimeRes::Infer), |this| {
this.resolve_anon_const(constant, IsRepeatExpr::No);
})
})
@ -4126,7 +4126,7 @@ fn resolve_expr(&mut self, expr: &'ast Expr, parent: Option<&'ast Expr>) {
ExprKind::Repeat(ref elem, ref ct) => {
self.visit_expr(elem);
self.with_lifetime_rib(LifetimeRibKind::AnonConst, |this| {
this.with_lifetime_rib(LifetimeRibKind::Elided(LifetimeRes::Static), |this| {
this.with_lifetime_rib(LifetimeRibKind::Elided(LifetimeRes::Infer), |this| {
this.resolve_anon_const(ct, IsRepeatExpr::Yes)
})
});

View file

@ -0,0 +1,20 @@
// Verify that elided lifetimes inside anonymous constants are not forced to be `'static`.
// check-pass
fn foo() -> [(); {
let a = 10_usize;
let b: &'_ usize = &a;
*b
}] {
[(); 10]
}
fn bar() -> [(); 10] {
[(); {
let a = 10_usize;
let b: &'_ usize = &a;
*b
}]
}
fn main() {}