Fall through when resolving elided assoc const lifetimes
This commit is contained in:
parent
88d9b37a15
commit
b62eeb2aac
@ -313,7 +313,7 @@ enum LifetimeRibKind {
|
||||
|
||||
/// Resolves elided lifetimes to `'static`, but gives a warning that this behavior
|
||||
/// is a bug and will be reverted soon.
|
||||
AnonymousWarnToStatic(NodeId),
|
||||
AnonymousWarn(NodeId),
|
||||
|
||||
/// Signal we cannot find which should be the anonymous lifetime.
|
||||
ElisionFailure,
|
||||
@ -1154,7 +1154,7 @@ fn visit_path_segment(&mut self, path_segment: &'ast PathSegment) {
|
||||
}
|
||||
LifetimeRibKind::AnonymousCreateParameter { .. }
|
||||
| LifetimeRibKind::AnonymousReportError
|
||||
| LifetimeRibKind::AnonymousWarnToStatic(_)
|
||||
| LifetimeRibKind::AnonymousWarn(_)
|
||||
| LifetimeRibKind::Elided(_)
|
||||
| LifetimeRibKind::ElisionFailure
|
||||
| LifetimeRibKind::ConcreteAnonConst(_)
|
||||
@ -1522,7 +1522,7 @@ fn resolve_lifetime(&mut self, lifetime: &'ast Lifetime, use_ctxt: visit::Lifeti
|
||||
// lifetime would be illegal.
|
||||
LifetimeRibKind::Item
|
||||
| LifetimeRibKind::AnonymousReportError
|
||||
| LifetimeRibKind::AnonymousWarnToStatic(_)
|
||||
| LifetimeRibKind::AnonymousWarn(_)
|
||||
| LifetimeRibKind::ElisionFailure => Some(LifetimeUseSet::Many),
|
||||
// An anonymous lifetime is legal here, and bound to the right
|
||||
// place, go ahead.
|
||||
@ -1585,7 +1585,7 @@ fn resolve_lifetime(&mut self, lifetime: &'ast Lifetime, use_ctxt: visit::Lifeti
|
||||
| LifetimeRibKind::Generics { .. }
|
||||
| LifetimeRibKind::ElisionFailure
|
||||
| LifetimeRibKind::AnonymousReportError
|
||||
| LifetimeRibKind::AnonymousWarnToStatic(_) => {}
|
||||
| LifetimeRibKind::AnonymousWarn(_) => {}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1625,8 +1625,7 @@ fn resolve_anonymous_lifetime(&mut self, lifetime: &Lifetime, elided: bool) {
|
||||
self.record_lifetime_res(lifetime.id, res, elision_candidate);
|
||||
return;
|
||||
}
|
||||
LifetimeRibKind::AnonymousWarnToStatic(node_id) => {
|
||||
self.record_lifetime_res(lifetime.id, LifetimeRes::Static, elision_candidate);
|
||||
LifetimeRibKind::AnonymousWarn(node_id) => {
|
||||
let msg = if elided {
|
||||
"`&` without an explicit lifetime name cannot be used here"
|
||||
} else {
|
||||
@ -1642,7 +1641,6 @@ fn resolve_anonymous_lifetime(&mut self, lifetime: &Lifetime, elided: bool) {
|
||||
span: lifetime.ident.span,
|
||||
},
|
||||
);
|
||||
return;
|
||||
}
|
||||
LifetimeRibKind::AnonymousReportError => {
|
||||
let (msg, note) = if elided {
|
||||
@ -1840,7 +1838,7 @@ fn resolve_elided_lifetimes_in_path(
|
||||
// impl Foo for std::cell::Ref<u32> // note lack of '_
|
||||
// async fn foo(_: std::cell::Ref<u32>) { ... }
|
||||
LifetimeRibKind::AnonymousCreateParameter { report_in_path: true, .. }
|
||||
| LifetimeRibKind::AnonymousWarnToStatic(_) => {
|
||||
| LifetimeRibKind::AnonymousWarn(_) => {
|
||||
let sess = self.r.tcx.sess;
|
||||
let mut err = rustc_errors::struct_span_err!(
|
||||
sess,
|
||||
@ -2936,33 +2934,30 @@ fn resolve_impl_item(
|
||||
kind: LifetimeBinderKind::ConstItem,
|
||||
},
|
||||
|this| {
|
||||
this.with_lifetime_rib(
|
||||
LifetimeRibKind::AnonymousWarnToStatic(item.id),
|
||||
|this| {
|
||||
// If this is a trait impl, ensure the const
|
||||
// exists in trait
|
||||
this.check_trait_item(
|
||||
item.id,
|
||||
item.ident,
|
||||
&item.kind,
|
||||
ValueNS,
|
||||
item.span,
|
||||
seen_trait_items,
|
||||
|i, s, c| ConstNotMemberOfTrait(i, s, c),
|
||||
);
|
||||
this.with_lifetime_rib(LifetimeRibKind::AnonymousWarn(item.id), |this| {
|
||||
// If this is a trait impl, ensure the const
|
||||
// exists in trait
|
||||
this.check_trait_item(
|
||||
item.id,
|
||||
item.ident,
|
||||
&item.kind,
|
||||
ValueNS,
|
||||
item.span,
|
||||
seen_trait_items,
|
||||
|i, s, c| ConstNotMemberOfTrait(i, s, c),
|
||||
);
|
||||
|
||||
this.visit_generics(generics);
|
||||
this.visit_ty(ty);
|
||||
if let Some(expr) = expr {
|
||||
// We allow arbitrary const expressions inside of associated consts,
|
||||
// even if they are potentially not const evaluatable.
|
||||
//
|
||||
// Type parameters can already be used and as associated consts are
|
||||
// not used as part of the type system, this is far less surprising.
|
||||
this.resolve_const_body(expr, None);
|
||||
}
|
||||
},
|
||||
);
|
||||
this.visit_generics(generics);
|
||||
this.visit_ty(ty);
|
||||
if let Some(expr) = expr {
|
||||
// We allow arbitrary const expressions inside of associated consts,
|
||||
// even if they are potentially not const evaluatable.
|
||||
//
|
||||
// Type parameters can already be used and as associated consts are
|
||||
// not used as part of the type system, this is far less surprising.
|
||||
this.resolve_const_body(expr, None);
|
||||
}
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
12
tests/ui/associated-consts/double-elided.rs
Normal file
12
tests/ui/associated-consts/double-elided.rs
Normal file
@ -0,0 +1,12 @@
|
||||
struct S;
|
||||
|
||||
impl S {
|
||||
const C: &&str = &"";
|
||||
//~^ WARN `&` without an explicit lifetime name cannot be used here
|
||||
//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
//~| WARN `&` without an explicit lifetime name cannot be used here
|
||||
//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
//~| ERROR in type `&&str`, reference has a longer lifetime than the data it references
|
||||
}
|
||||
|
||||
fn main() {}
|
47
tests/ui/associated-consts/double-elided.stderr
Normal file
47
tests/ui/associated-consts/double-elided.stderr
Normal file
@ -0,0 +1,47 @@
|
||||
warning: `&` without an explicit lifetime name cannot be used here
|
||||
--> $DIR/double-elided.rs:4:14
|
||||
|
|
||||
LL | const C: &&str = &"";
|
||||
| ^
|
||||
|
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #115010 <https://github.com/rust-lang/rust/issues/115010>
|
||||
= note: `#[warn(elided_lifetimes_in_associated_constant)]` on by default
|
||||
help: use the `'static` lifetime
|
||||
|
|
||||
LL | const C: &'static &str = &"";
|
||||
| +++++++
|
||||
|
||||
warning: `&` without an explicit lifetime name cannot be used here
|
||||
--> $DIR/double-elided.rs:4:15
|
||||
|
|
||||
LL | const C: &&str = &"";
|
||||
| ^
|
||||
|
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #115010 <https://github.com/rust-lang/rust/issues/115010>
|
||||
help: use the `'static` lifetime
|
||||
|
|
||||
LL | const C: &&'static str = &"";
|
||||
| +++++++
|
||||
|
||||
error[E0491]: in type `&&str`, reference has a longer lifetime than the data it references
|
||||
--> $DIR/double-elided.rs:4:5
|
||||
|
|
||||
LL | const C: &&str = &"";
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the pointer is valid for the anonymous lifetime as defined here
|
||||
--> $DIR/double-elided.rs:4:14
|
||||
|
|
||||
LL | const C: &&str = &"";
|
||||
| ^
|
||||
note: but the referenced data is only valid for the anonymous lifetime as defined here
|
||||
--> $DIR/double-elided.rs:4:14
|
||||
|
|
||||
LL | const C: &&str = &"";
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error; 2 warnings emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0491`.
|
Loading…
Reference in New Issue
Block a user