Use the correct binder scope for elided lifetimes in assoc consts

This commit is contained in:
Oli Scherer 2025-03-26 12:39:07 +00:00
parent 6e8abb5ec6
commit a830c59f24
6 changed files with 51 additions and 59 deletions

View file

@ -3332,6 +3332,14 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
span: generics.span,
kind: LifetimeBinderKind::ConstItem,
},
|this| {
this.with_lifetime_rib(
// Until these are a hard error, we need to create them within the correct binder,
// Otherwise the lifetimes of this assoc const think they are lifetimes of the trait.
LifetimeRibKind::AnonymousCreateParameter {
binder: item.id,
report_in_path: true,
},
|this| {
this.with_lifetime_rib(
LifetimeRibKind::StaticIfNoLifetimeInScope {
@ -3363,6 +3371,8 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
this.resolve_const_body(expr, None);
}
},
)
},
);
},
);

View file

@ -35,8 +35,6 @@ note: cannot automatically infer `'static` because of other lifetimes in scope
|
LL | impl<'a> Foo<'a> {
| ^^
LL | const FOO: Foo<'_> = Foo { x: PhantomData::<&()> };
| ^^
help: use the `'static` lifetime
|
LL | const BAR: &'static () = &();

View file

@ -16,7 +16,7 @@ impl Bar for Foo<'_> {
const STATIC: &str = "";
//~^ ERROR `&` without an explicit lifetime name cannot be used here
//~| WARN this was previously accepted by the compiler but is being phased out
//~| ERROR const not compatible with trait
//~| ERROR lifetime parameters or bounds on const `STATIC` do not match the trait declaration
}
fn main() {}

View file

@ -39,21 +39,15 @@ help: use the `'static` lifetime
LL | const STATIC: &'static str = "";
| +++++++
error[E0308]: const not compatible with trait
--> $DIR/elided-lifetime.rs:16:5
error[E0195]: lifetime parameters or bounds on const `STATIC` do not match the trait declaration
--> $DIR/elided-lifetime.rs:16:17
|
LL | const STATIC: &str;
| - lifetimes in impl do not match this const in trait
...
LL | const STATIC: &str = "";
| ^^^^^^^^^^^^^^^^^^ lifetime mismatch
|
= note: expected reference `&'static _`
found reference `&_`
note: the anonymous lifetime as defined here...
--> $DIR/elided-lifetime.rs:16:19
|
LL | const STATIC: &str = "";
| ^
= note: ...does not necessarily outlive the static lifetime
| ^ lifetimes do not match const in trait
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0308`.
For more information about this error, try `rustc --explain E0195`.

View file

@ -9,7 +9,7 @@ impl Bar<'_> for A {
const STATIC: &str = "";
//~^ ERROR `&` without an explicit lifetime name cannot be used here
//~| WARN this was previously accepted by the compiler but is being phased out
//~| ERROR const not compatible with trait
//~| ERROR lifetime parameters or bounds on const `STATIC` do not match the trait declaration
}
struct B;

View file

@ -21,25 +21,15 @@ help: use the `'static` lifetime
LL | const STATIC: &'static str = "";
| +++++++
error[E0308]: const not compatible with trait
--> $DIR/static-trait-impl.rs:9:5
error[E0195]: lifetime parameters or bounds on const `STATIC` do not match the trait declaration
--> $DIR/static-trait-impl.rs:9:17
|
LL | const STATIC: &'a str;
| - lifetimes in impl do not match this const in trait
...
LL | const STATIC: &str = "";
| ^^^^^^^^^^^^^^^^^^ lifetime mismatch
|
= note: expected reference `&_`
found reference `&_`
note: the anonymous lifetime as defined here...
--> $DIR/static-trait-impl.rs:9:19
|
LL | const STATIC: &str = "";
| ^
note: ...does not necessarily outlive the anonymous lifetime as defined here
--> $DIR/static-trait-impl.rs:8:10
|
LL | impl Bar<'_> for A {
| ^^
| ^ lifetimes do not match const in trait
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.
For more information about this error, try `rustc --explain E0195`.