resolve: prohibit anon const non-static lifetimes
This commit modifies name resolution to emit an error when non-static lifetimes are used in anonymous constants when the `min_const_generics` feature is enabled. Signed-off-by: David Wood <david@davidtw.co>
This commit is contained in:
parent
154f1f544d
commit
eacfb2b265
4 changed files with 81 additions and 0 deletions
|
@ -16,6 +16,7 @@ use rustc_hir::def::{self, CtorKind, DefKind};
|
|||
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE};
|
||||
use rustc_hir::PrimTy;
|
||||
use rustc_session::config::nightly_options;
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::hygiene::MacroKind;
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use rustc_span::{BytePos, Span, DUMMY_SP};
|
||||
|
@ -1599,4 +1600,32 @@ impl<'tcx> LifetimeContext<'_, 'tcx> {
|
|||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
/// Non-static lifetimes are prohibited in anonymous constants under `min_const_generics` so
|
||||
/// this function will emit an error if `min_const_generics` is enabled, the body identified by
|
||||
/// `body_id` is an anonymous constant and `lifetime_ref` is non-static.
|
||||
crate fn maybe_emit_forbidden_non_static_lifetime_error(
|
||||
&self,
|
||||
body_id: hir::BodyId,
|
||||
lifetime_ref: &'tcx hir::Lifetime,
|
||||
) {
|
||||
let is_anon_const = matches!(
|
||||
self.tcx.def_kind(self.tcx.hir().body_owner_def_id(body_id)),
|
||||
hir::def::DefKind::AnonConst
|
||||
);
|
||||
let is_allowed_lifetime = matches!(
|
||||
lifetime_ref.name,
|
||||
hir::LifetimeName::Implicit | hir::LifetimeName::Static | hir::LifetimeName::Underscore
|
||||
);
|
||||
|
||||
if self.tcx.features().min_const_generics && is_anon_const && !is_allowed_lifetime {
|
||||
feature_err(
|
||||
&self.tcx.sess.parse_sess,
|
||||
sym::const_generics,
|
||||
lifetime_ref.span,
|
||||
"a non-static lifetime is not allowed in a `const`",
|
||||
)
|
||||
.emit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1777,6 +1777,10 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
|||
let result = loop {
|
||||
match *scope {
|
||||
Scope::Body { id, s } => {
|
||||
// Non-static lifetimes are prohibited in anonymous constants under
|
||||
// `min_const_generics`.
|
||||
self.maybe_emit_forbidden_non_static_lifetime_error(id, lifetime_ref);
|
||||
|
||||
outermost_body = Some(id);
|
||||
scope = s;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue