Remove the infer_static_outlives_requirements
feature
This commit is contained in:
parent
d8f07654e8
commit
153f01e42c
compiler
@ -411,8 +411,6 @@ declare_features! (
|
|||||||
(active, if_let_guard, "1.47.0", Some(51114), None),
|
(active, if_let_guard, "1.47.0", Some(51114), None),
|
||||||
/// Allows using imported `main` function
|
/// Allows using imported `main` function
|
||||||
(active, imported_main, "1.53.0", Some(28937), None),
|
(active, imported_main, "1.53.0", Some(28937), None),
|
||||||
/// Allows inferring `'static` outlives requirements (RFC 2093).
|
|
||||||
(active, infer_static_outlives_requirements, "1.26.0", Some(54185), None),
|
|
||||||
/// Allows associated types in inherent impls.
|
/// Allows associated types in inherent impls.
|
||||||
(incomplete, inherent_associated_types, "1.52.0", Some(8995), None),
|
(incomplete, inherent_associated_types, "1.52.0", Some(8995), None),
|
||||||
/// Allow anonymous constants from an inline `const` block
|
/// Allow anonymous constants from an inline `const` block
|
||||||
|
@ -109,6 +109,9 @@ declare_features! (
|
|||||||
/// Allows in-band quantification of lifetime bindings (e.g., `fn foo(x: &'a u8) -> &'a u8`).
|
/// Allows in-band quantification of lifetime bindings (e.g., `fn foo(x: &'a u8) -> &'a u8`).
|
||||||
(removed, in_band_lifetimes, "1.23.0", Some(44524), None,
|
(removed, in_band_lifetimes, "1.23.0", Some(44524), None,
|
||||||
Some("removed due to unsolved ergonomic questions and added lifetime resolution complexity")),
|
Some("removed due to unsolved ergonomic questions and added lifetime resolution complexity")),
|
||||||
|
/// Allows inferring `'static` outlives requirements (RFC 2093).
|
||||||
|
(removed, infer_static_outlives_requirements, "1.63.0", Some(54185), None,
|
||||||
|
Some("removed as it caused some confusion and discussion was inactive for years")),
|
||||||
/// Lazily evaluate constants. This allows constants to depend on type parameters.
|
/// Lazily evaluate constants. This allows constants to depend on type parameters.
|
||||||
(removed, lazy_normalization_consts, "1.46.0", Some(72219), None, Some("superseded by `generic_const_exprs`")),
|
(removed, lazy_normalization_consts, "1.46.0", Some(72219), None, Some("superseded by `generic_const_exprs`")),
|
||||||
/// Allows using the `#[link_args]` attribute.
|
/// Allows using the `#[link_args]` attribute.
|
||||||
|
@ -2113,7 +2113,6 @@ impl ExplicitOutlivesRequirements {
|
|||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
bounds: &hir::GenericBounds<'_>,
|
bounds: &hir::GenericBounds<'_>,
|
||||||
inferred_outlives: &[ty::Region<'tcx>],
|
inferred_outlives: &[ty::Region<'tcx>],
|
||||||
infer_static: bool,
|
|
||||||
) -> Vec<(usize, Span)> {
|
) -> Vec<(usize, Span)> {
|
||||||
use rustc_middle::middle::resolve_lifetime::Region;
|
use rustc_middle::middle::resolve_lifetime::Region;
|
||||||
|
|
||||||
@ -2123,9 +2122,6 @@ impl ExplicitOutlivesRequirements {
|
|||||||
.filter_map(|(i, bound)| {
|
.filter_map(|(i, bound)| {
|
||||||
if let hir::GenericBound::Outlives(lifetime) = bound {
|
if let hir::GenericBound::Outlives(lifetime) = bound {
|
||||||
let is_inferred = match tcx.named_region(lifetime.hir_id) {
|
let is_inferred = match tcx.named_region(lifetime.hir_id) {
|
||||||
Some(Region::Static) if infer_static => {
|
|
||||||
inferred_outlives.iter().any(|r| matches!(**r, ty::ReStatic))
|
|
||||||
}
|
|
||||||
Some(Region::EarlyBound(index, ..)) => inferred_outlives.iter().any(|r| {
|
Some(Region::EarlyBound(index, ..)) => inferred_outlives.iter().any(|r| {
|
||||||
if let ty::ReEarlyBound(ebr) = **r { ebr.index == index } else { false }
|
if let ty::ReEarlyBound(ebr) = **r { ebr.index == index } else { false }
|
||||||
}),
|
}),
|
||||||
@ -2201,7 +2197,6 @@ impl<'tcx> LateLintPass<'tcx> for ExplicitOutlivesRequirements {
|
|||||||
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
|
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
|
||||||
use rustc_middle::middle::resolve_lifetime::Region;
|
use rustc_middle::middle::resolve_lifetime::Region;
|
||||||
|
|
||||||
let infer_static = cx.tcx.features().infer_static_outlives_requirements;
|
|
||||||
let def_id = item.def_id;
|
let def_id = item.def_id;
|
||||||
if let hir::ItemKind::Struct(_, ref hir_generics)
|
if let hir::ItemKind::Struct(_, ref hir_generics)
|
||||||
| hir::ItemKind::Enum(_, ref hir_generics)
|
| hir::ItemKind::Enum(_, ref hir_generics)
|
||||||
@ -2262,12 +2257,8 @@ impl<'tcx> LateLintPass<'tcx> for ExplicitOutlivesRequirements {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let bound_spans = self.collect_outlives_bound_spans(
|
let bound_spans =
|
||||||
cx.tcx,
|
self.collect_outlives_bound_spans(cx.tcx, bounds, &relevant_lifetimes);
|
||||||
bounds,
|
|
||||||
&relevant_lifetimes,
|
|
||||||
infer_static,
|
|
||||||
);
|
|
||||||
bound_count += bound_spans.len();
|
bound_count += bound_spans.len();
|
||||||
|
|
||||||
let drop_predicate = bound_spans.len() == bounds.len();
|
let drop_predicate = bound_spans.len() == bounds.len();
|
||||||
|
@ -21,7 +21,7 @@ pub fn insert_outlives_predicate<'tcx>(
|
|||||||
) {
|
) {
|
||||||
// If the `'a` region is bound within the field type itself, we
|
// If the `'a` region is bound within the field type itself, we
|
||||||
// don't want to propagate this constraint to the header.
|
// don't want to propagate this constraint to the header.
|
||||||
if !is_free_region(tcx, outlived_region) {
|
if !is_free_region(outlived_region) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ pub fn insert_outlives_predicate<'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
GenericArgKind::Lifetime(r) => {
|
GenericArgKind::Lifetime(r) => {
|
||||||
if !is_free_region(tcx, r) {
|
if !is_free_region(r) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
required_predicates.entry(ty::OutlivesPredicate(kind, outlived_region)).or_insert(span);
|
required_predicates.entry(ty::OutlivesPredicate(kind, outlived_region)).or_insert(span);
|
||||||
@ -131,7 +131,7 @@ pub fn insert_outlives_predicate<'tcx>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_free_region(tcx: TyCtxt<'_>, region: Region<'_>) -> bool {
|
fn is_free_region(region: Region<'_>) -> bool {
|
||||||
// First, screen for regions that might appear in a type header.
|
// First, screen for regions that might appear in a type header.
|
||||||
match *region {
|
match *region {
|
||||||
// These correspond to `T: 'a` relationships:
|
// These correspond to `T: 'a` relationships:
|
||||||
@ -144,13 +144,12 @@ fn is_free_region(tcx: TyCtxt<'_>, region: Region<'_>) -> bool {
|
|||||||
ty::ReEarlyBound(_) => true,
|
ty::ReEarlyBound(_) => true,
|
||||||
|
|
||||||
// These correspond to `T: 'static` relationships which can be
|
// These correspond to `T: 'static` relationships which can be
|
||||||
// rather surprising. We are therefore putting this behind a
|
// rather surprising.
|
||||||
// feature flag:
|
|
||||||
//
|
//
|
||||||
// struct Foo<'a, T> {
|
// struct Foo<'a, T> {
|
||||||
// field: &'static T, // this would generate a ReStatic
|
// field: &'static T, // this would generate a ReStatic
|
||||||
// }
|
// }
|
||||||
ty::ReStatic => tcx.sess.features_untracked().infer_static_outlives_requirements,
|
ty::ReStatic => false,
|
||||||
|
|
||||||
// Late-bound regions can appear in `fn` types:
|
// Late-bound regions can appear in `fn` types:
|
||||||
//
|
//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user