mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
remove borrowck handling for inline const patterns
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
BoundRegionConversionTime, InferCtxt, NllRegionVariableOrigin, RegionVariableOrigin,
|
||||
};
|
||||
use rustc_infer::traits::PredicateObligations;
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::mir::visit::{NonMutatingUseContext, PlaceContext, Visitor};
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::traits::query::NoSolution;
|
||||
@@ -28,7 +29,6 @@
|
||||
self, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, CoroutineArgsExt,
|
||||
GenericArgsRef, Ty, TyCtxt, TypeVisitableExt, UserArgs, UserTypeAnnotationIndex, fold_regions,
|
||||
};
|
||||
use rustc_middle::{bug, span_bug};
|
||||
use rustc_mir_dataflow::move_paths::MoveData;
|
||||
use rustc_mir_dataflow::points::DenseLocationMap;
|
||||
use rustc_span::def_id::CRATE_DEF_ID;
|
||||
@@ -387,18 +387,10 @@ fn unsized_feature_enabled(&self) -> bool {
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
fn check_user_type_annotations(&mut self) {
|
||||
debug!(?self.user_type_annotations);
|
||||
let tcx = self.tcx();
|
||||
for user_annotation in self.user_type_annotations {
|
||||
let CanonicalUserTypeAnnotation { span, ref user_ty, inferred_ty } = *user_annotation;
|
||||
let annotation = self.instantiate_canonical(span, user_ty);
|
||||
if let ty::UserTypeKind::TypeOf(def, args) = annotation.kind
|
||||
&& let DefKind::InlineConst = tcx.def_kind(def)
|
||||
{
|
||||
assert!(annotation.bounds.is_empty());
|
||||
self.check_inline_const(inferred_ty, def.expect_local(), args, span);
|
||||
} else {
|
||||
self.ascribe_user_type(inferred_ty, annotation, span);
|
||||
}
|
||||
self.ascribe_user_type(inferred_ty, annotation, span);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -560,36 +552,6 @@ fn check_promoted(&mut self, promoted_body: &'a Body<'tcx>, location: Location)
|
||||
self.constraints.liveness_constraints.add_location(region, location);
|
||||
}
|
||||
}
|
||||
|
||||
fn check_inline_const(
|
||||
&mut self,
|
||||
inferred_ty: Ty<'tcx>,
|
||||
def_id: LocalDefId,
|
||||
args: UserArgs<'tcx>,
|
||||
span: Span,
|
||||
) {
|
||||
assert!(args.user_self_ty.is_none());
|
||||
let tcx = self.tcx();
|
||||
let const_ty = tcx.type_of(def_id).instantiate(tcx, args.args);
|
||||
if let Err(terr) =
|
||||
self.eq_types(const_ty, inferred_ty, Locations::All(span), ConstraintCategory::Boring)
|
||||
{
|
||||
span_bug!(
|
||||
span,
|
||||
"bad inline const pattern: ({:?} = {:?}) {:?}",
|
||||
const_ty,
|
||||
inferred_ty,
|
||||
terr
|
||||
);
|
||||
}
|
||||
let args = self.infcx.resolve_vars_if_possible(args.args);
|
||||
let predicates = self.prove_closure_bounds(tcx, def_id, args, Locations::All(span));
|
||||
self.normalize_and_prove_instantiated_predicates(
|
||||
def_id.to_def_id(),
|
||||
predicates,
|
||||
Locations::All(span),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
||||
@@ -1731,12 +1693,7 @@ fn visit_operand(&mut self, op: &Operand<'tcx>, location: Location) {
|
||||
let def_id = uv.def;
|
||||
if tcx.def_kind(def_id) == DefKind::InlineConst {
|
||||
let def_id = def_id.expect_local();
|
||||
let predicates = self.prove_closure_bounds(
|
||||
tcx,
|
||||
def_id,
|
||||
uv.args,
|
||||
location.to_locations(),
|
||||
);
|
||||
let predicates = self.prove_closure_bounds(tcx, def_id, uv.args, location);
|
||||
self.normalize_and_prove_instantiated_predicates(
|
||||
def_id.to_def_id(),
|
||||
predicates,
|
||||
@@ -2519,15 +2476,9 @@ fn prove_aggregate_predicates(
|
||||
// clauses on the struct.
|
||||
AggregateKind::Closure(def_id, args)
|
||||
| AggregateKind::CoroutineClosure(def_id, args)
|
||||
| AggregateKind::Coroutine(def_id, args) => (
|
||||
def_id,
|
||||
self.prove_closure_bounds(
|
||||
tcx,
|
||||
def_id.expect_local(),
|
||||
args,
|
||||
location.to_locations(),
|
||||
),
|
||||
),
|
||||
| AggregateKind::Coroutine(def_id, args) => {
|
||||
(def_id, self.prove_closure_bounds(tcx, def_id.expect_local(), args, location))
|
||||
}
|
||||
|
||||
AggregateKind::Array(_) | AggregateKind::Tuple | AggregateKind::RawPtr(..) => {
|
||||
(CRATE_DEF_ID.to_def_id(), ty::InstantiatedPredicates::empty())
|
||||
@@ -2546,12 +2497,12 @@ fn prove_closure_bounds(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def_id: LocalDefId,
|
||||
args: GenericArgsRef<'tcx>,
|
||||
locations: Locations,
|
||||
location: Location,
|
||||
) -> ty::InstantiatedPredicates<'tcx> {
|
||||
let root_def_id = self.root_cx.root_def_id();
|
||||
// We will have to handle propagated closure requirements for this closure,
|
||||
// but need to defer this until the nested body has been fully borrow checked.
|
||||
self.deferred_closure_requirements.push((def_id, args, locations));
|
||||
self.deferred_closure_requirements.push((def_id, args, location.to_locations()));
|
||||
|
||||
// Equate closure args to regions inherited from `root_def_id`. Fixes #98589.
|
||||
let typeck_root_args = ty::GenericArgs::identity_for_item(tcx, root_def_id);
|
||||
@@ -2575,7 +2526,7 @@ fn prove_closure_bounds(
|
||||
if let Err(_) = self.eq_args(
|
||||
typeck_root_args,
|
||||
parent_args,
|
||||
locations,
|
||||
location.to_locations(),
|
||||
ConstraintCategory::BoringNoLocation,
|
||||
) {
|
||||
span_mirbug!(
|
||||
|
||||
Reference in New Issue
Block a user