Use the correct binder scope for elided lifetimes in assoc consts
This commit is contained in:
parent
6e8abb5ec6
commit
a830c59f24
6 changed files with 51 additions and 59 deletions
|
@ -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);
|
||||
}
|
||||
},
|
||||
)
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
|
|
|
@ -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 () = &();
|
||||
|
|
|
@ -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() {}
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue