Add warn(unreachable_pub)
to rustc_borrowck
.
This commit is contained in:
parent
cb3f435699
commit
0685c97843
@ -9,7 +9,7 @@
|
|||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
impl<'infcx, 'tcx> crate::MirBorrowckCtxt<'_, '_, 'infcx, 'tcx> {
|
impl<'infcx, 'tcx> crate::MirBorrowckCtxt<'_, '_, 'infcx, 'tcx> {
|
||||||
pub fn dcx(&self) -> DiagCtxtHandle<'infcx> {
|
pub(crate) fn dcx(&self) -> DiagCtxtHandle<'infcx> {
|
||||||
self.infcx.dcx()
|
self.infcx.dcx()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
use crate::{places_conflict, BorrowSet, PlaceConflictBias, PlaceExt, RegionInferenceContext};
|
use crate::{places_conflict, BorrowSet, PlaceConflictBias, PlaceExt, RegionInferenceContext};
|
||||||
|
|
||||||
/// The results of the dataflow analyses used by the borrow checker.
|
/// The results of the dataflow analyses used by the borrow checker.
|
||||||
pub struct BorrowckResults<'a, 'mir, 'tcx> {
|
pub(crate) struct BorrowckResults<'a, 'mir, 'tcx> {
|
||||||
pub(crate) borrows: Results<'tcx, Borrows<'a, 'mir, 'tcx>>,
|
pub(crate) borrows: Results<'tcx, Borrows<'a, 'mir, 'tcx>>,
|
||||||
pub(crate) uninits: Results<'tcx, MaybeUninitializedPlaces<'a, 'mir, 'tcx>>,
|
pub(crate) uninits: Results<'tcx, MaybeUninitializedPlaces<'a, 'mir, 'tcx>>,
|
||||||
pub(crate) ever_inits: Results<'tcx, EverInitializedPlaces<'a, 'mir, 'tcx>>,
|
pub(crate) ever_inits: Results<'tcx, EverInitializedPlaces<'a, 'mir, 'tcx>>,
|
||||||
@ -22,7 +22,7 @@ pub struct BorrowckResults<'a, 'mir, 'tcx> {
|
|||||||
|
|
||||||
/// The transient state of the dataflow analyses used by the borrow checker.
|
/// The transient state of the dataflow analyses used by the borrow checker.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct BorrowckFlowState<'a, 'mir, 'tcx> {
|
pub(crate) struct BorrowckFlowState<'a, 'mir, 'tcx> {
|
||||||
pub(crate) borrows: <Borrows<'a, 'mir, 'tcx> as AnalysisDomain<'tcx>>::Domain,
|
pub(crate) borrows: <Borrows<'a, 'mir, 'tcx> as AnalysisDomain<'tcx>>::Domain,
|
||||||
pub(crate) uninits: <MaybeUninitializedPlaces<'a, 'mir, 'tcx> as AnalysisDomain<'tcx>>::Domain,
|
pub(crate) uninits: <MaybeUninitializedPlaces<'a, 'mir, 'tcx> as AnalysisDomain<'tcx>>::Domain,
|
||||||
pub(crate) ever_inits: <EverInitializedPlaces<'a, 'mir, 'tcx> as AnalysisDomain<'tcx>>::Domain,
|
pub(crate) ever_inits: <EverInitializedPlaces<'a, 'mir, 'tcx> as AnalysisDomain<'tcx>>::Domain,
|
||||||
|
@ -4,13 +4,13 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Eq, PartialEq, Clone)]
|
#[derive(Eq, PartialEq, Clone)]
|
||||||
pub enum DefUse {
|
pub(crate) enum DefUse {
|
||||||
Def,
|
Def,
|
||||||
Use,
|
Use,
|
||||||
Drop,
|
Drop,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn categorize(context: PlaceContext) -> Option<DefUse> {
|
pub(crate) fn categorize(context: PlaceContext) -> Option<DefUse> {
|
||||||
match context {
|
match context {
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// DEFS
|
// DEFS
|
||||||
|
@ -645,7 +645,7 @@ fn visit_expr(&mut self, e: &hir::Expr<'_>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn suggest_reborrow(
|
pub(crate) fn suggest_reborrow(
|
||||||
&self,
|
&self,
|
||||||
err: &mut Diag<'infcx>,
|
err: &mut Diag<'infcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
@ -1891,10 +1891,10 @@ fn suggest_copy_for_type_in_cloned_ref(&self, err: &mut Diag<'infcx>, place: Pla
|
|||||||
struct FindUselessClone<'tcx> {
|
struct FindUselessClone<'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
typeck_results: &'tcx ty::TypeckResults<'tcx>,
|
typeck_results: &'tcx ty::TypeckResults<'tcx>,
|
||||||
pub clones: Vec<&'tcx hir::Expr<'tcx>>,
|
clones: Vec<&'tcx hir::Expr<'tcx>>,
|
||||||
}
|
}
|
||||||
impl<'tcx> FindUselessClone<'tcx> {
|
impl<'tcx> FindUselessClone<'tcx> {
|
||||||
pub fn new(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Self {
|
fn new(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Self {
|
||||||
Self { tcx, typeck_results: tcx.typeck(def_id), clones: vec![] }
|
Self { tcx, typeck_results: tcx.typeck(def_id), clones: vec![] }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1916,7 +1916,7 @@ fn visit_expr(&mut self, ex: &'tcx hir::Expr<'tcx>) {
|
|||||||
let body = hir.body(body_id).value;
|
let body = hir.body(body_id).value;
|
||||||
expr_finder.visit_expr(body);
|
expr_finder.visit_expr(body);
|
||||||
|
|
||||||
pub struct Holds<'tcx> {
|
struct Holds<'tcx> {
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,11 +58,11 @@
|
|||||||
pub(crate) use rustc_middle::util::CallKind;
|
pub(crate) use rustc_middle::util::CallKind;
|
||||||
|
|
||||||
pub(super) struct DescribePlaceOpt {
|
pub(super) struct DescribePlaceOpt {
|
||||||
pub including_downcast: bool,
|
including_downcast: bool,
|
||||||
|
|
||||||
/// Enable/Disable tuple fields.
|
/// Enable/Disable tuple fields.
|
||||||
/// For example `x` tuple. if it's `true` `x.0`. Otherwise `x`
|
/// For example `x` tuple. if it's `true` `x.0`. Otherwise `x`
|
||||||
pub including_tuple_field: bool,
|
including_tuple_field: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) struct IncludingTupleField(pub(super) bool);
|
pub(super) struct IncludingTupleField(pub(super) bool);
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
use crate::MirBorrowckCtxt;
|
use crate::MirBorrowckCtxt;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum IllegalMoveOriginKind<'tcx> {
|
pub(crate) enum IllegalMoveOriginKind<'tcx> {
|
||||||
/// Illegal move due to attempt to move from behind a reference.
|
/// Illegal move due to attempt to move from behind a reference.
|
||||||
BorrowedContent {
|
BorrowedContent {
|
||||||
/// The place the reference refers to: if erroneous code was trying to
|
/// The place the reference refers to: if erroneous code was trying to
|
||||||
|
@ -1374,7 +1374,7 @@ fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) -> Self::Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mut_borrow_of_mutable_ref(local_decl: &LocalDecl<'_>, local_name: Option<Symbol>) -> bool {
|
fn mut_borrow_of_mutable_ref(local_decl: &LocalDecl<'_>, local_name: Option<Symbol>) -> bool {
|
||||||
debug!("local_info: {:?}, ty.kind(): {:?}", local_decl.local_info, local_decl.ty.kind());
|
debug!("local_info: {:?}, ty.kind(): {:?}", local_decl.local_info, local_decl.ty.kind());
|
||||||
|
|
||||||
match *local_decl.local_info() {
|
match *local_decl.local_info() {
|
||||||
|
@ -31,7 +31,7 @@ enum SuggestedConstraint {
|
|||||||
///
|
///
|
||||||
/// Adds a help note suggesting adding a where clause with the needed constraints.
|
/// Adds a help note suggesting adding a where clause with the needed constraints.
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct OutlivesSuggestionBuilder {
|
pub(crate) struct OutlivesSuggestionBuilder {
|
||||||
/// The list of outlives constraints that need to be added. Specifically, we map each free
|
/// The list of outlives constraints that need to be added. Specifically, we map each free
|
||||||
/// region to all other regions that it must outlive. I will use the shorthand `fr:
|
/// region to all other regions that it must outlive. I will use the shorthand `fr:
|
||||||
/// outlived_frs`. Not all of these regions will already have names necessarily. Some could be
|
/// outlived_frs`. Not all of these regions will already have names necessarily. Some could be
|
||||||
|
@ -72,22 +72,24 @@ fn description(&self) -> &'static str {
|
|||||||
pub(crate) struct RegionErrors<'tcx>(Vec<(RegionErrorKind<'tcx>, ErrorGuaranteed)>, TyCtxt<'tcx>);
|
pub(crate) struct RegionErrors<'tcx>(Vec<(RegionErrorKind<'tcx>, ErrorGuaranteed)>, TyCtxt<'tcx>);
|
||||||
|
|
||||||
impl<'tcx> RegionErrors<'tcx> {
|
impl<'tcx> RegionErrors<'tcx> {
|
||||||
pub fn new(tcx: TyCtxt<'tcx>) -> Self {
|
pub(crate) fn new(tcx: TyCtxt<'tcx>) -> Self {
|
||||||
Self(vec![], tcx)
|
Self(vec![], tcx)
|
||||||
}
|
}
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn push(&mut self, val: impl Into<RegionErrorKind<'tcx>>) {
|
pub(crate) fn push(&mut self, val: impl Into<RegionErrorKind<'tcx>>) {
|
||||||
let val = val.into();
|
let val = val.into();
|
||||||
let guar = self.1.sess.dcx().delayed_bug(format!("{val:?}"));
|
let guar = self.1.sess.dcx().delayed_bug(format!("{val:?}"));
|
||||||
self.0.push((val, guar));
|
self.0.push((val, guar));
|
||||||
}
|
}
|
||||||
pub fn is_empty(&self) -> bool {
|
pub(crate) fn is_empty(&self) -> bool {
|
||||||
self.0.is_empty()
|
self.0.is_empty()
|
||||||
}
|
}
|
||||||
pub fn into_iter(self) -> impl Iterator<Item = (RegionErrorKind<'tcx>, ErrorGuaranteed)> {
|
pub(crate) fn into_iter(
|
||||||
|
self,
|
||||||
|
) -> impl Iterator<Item = (RegionErrorKind<'tcx>, ErrorGuaranteed)> {
|
||||||
self.0.into_iter()
|
self.0.into_iter()
|
||||||
}
|
}
|
||||||
pub fn has_errors(&self) -> Option<ErrorGuaranteed> {
|
pub(crate) fn has_errors(&self) -> Option<ErrorGuaranteed> {
|
||||||
self.0.get(0).map(|x| x.1)
|
self.0.get(0).map(|x| x.1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -141,7 +143,7 @@ pub(crate) enum RegionErrorKind<'tcx> {
|
|||||||
|
|
||||||
/// Information about the various region constraints involved in a borrow checker error.
|
/// Information about the various region constraints involved in a borrow checker error.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct ErrorConstraintInfo<'tcx> {
|
pub(crate) struct ErrorConstraintInfo<'tcx> {
|
||||||
// fr: outlived_fr
|
// fr: outlived_fr
|
||||||
pub(super) fr: RegionVid,
|
pub(super) fr: RegionVid,
|
||||||
pub(super) fr_is_local: bool,
|
pub(super) fr_is_local: bool,
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#![feature(rustdoc_internals)]
|
#![feature(rustdoc_internals)]
|
||||||
#![feature(stmt_expr_attributes)]
|
#![feature(stmt_expr_attributes)]
|
||||||
#![feature(try_blocks)]
|
#![feature(try_blocks)]
|
||||||
|
#![warn(unreachable_pub)]
|
||||||
// tidy-alphabetical-end
|
// tidy-alphabetical-end
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
@ -2444,7 +2445,7 @@ fn sort_span(&self) -> Span {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BorrowckDiags<'infcx, 'tcx> {
|
pub(crate) struct BorrowckDiags<'infcx, 'tcx> {
|
||||||
/// This field keeps track of move errors that are to be reported for given move indices.
|
/// This field keeps track of move errors that are to be reported for given move indices.
|
||||||
///
|
///
|
||||||
/// There are situations where many errors can be reported for a single move out (see
|
/// There are situations where many errors can be reported for a single move out (see
|
||||||
@ -2468,7 +2469,7 @@ pub struct BorrowckDiags<'infcx, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'infcx, 'tcx> BorrowckDiags<'infcx, 'tcx> {
|
impl<'infcx, 'tcx> BorrowckDiags<'infcx, 'tcx> {
|
||||||
pub fn new() -> Self {
|
pub(crate) fn new() -> Self {
|
||||||
BorrowckDiags {
|
BorrowckDiags {
|
||||||
buffered_move_errors: BTreeMap::new(),
|
buffered_move_errors: BTreeMap::new(),
|
||||||
buffered_mut_errors: Default::default(),
|
buffered_mut_errors: Default::default(),
|
||||||
@ -2476,25 +2477,25 @@ pub fn new() -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn buffer_error(&mut self, diag: Diag<'infcx>) {
|
pub(crate) fn buffer_error(&mut self, diag: Diag<'infcx>) {
|
||||||
self.buffered_diags.push(BufferedDiag::Error(diag));
|
self.buffered_diags.push(BufferedDiag::Error(diag));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn buffer_non_error(&mut self, diag: Diag<'infcx, ()>) {
|
pub(crate) fn buffer_non_error(&mut self, diag: Diag<'infcx, ()>) {
|
||||||
self.buffered_diags.push(BufferedDiag::NonError(diag));
|
self.buffered_diags.push(BufferedDiag::NonError(diag));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'infcx, 'tcx> MirBorrowckCtxt<'_, '_, 'infcx, 'tcx> {
|
impl<'infcx, 'tcx> MirBorrowckCtxt<'_, '_, 'infcx, 'tcx> {
|
||||||
pub fn buffer_error(&mut self, diag: Diag<'infcx>) {
|
pub(crate) fn buffer_error(&mut self, diag: Diag<'infcx>) {
|
||||||
self.diags.buffer_error(diag);
|
self.diags.buffer_error(diag);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn buffer_non_error(&mut self, diag: Diag<'infcx, ()>) {
|
pub(crate) fn buffer_non_error(&mut self, diag: Diag<'infcx, ()>) {
|
||||||
self.diags.buffer_non_error(diag);
|
self.diags.buffer_non_error(diag);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn buffer_move_error(
|
pub(crate) fn buffer_move_error(
|
||||||
&mut self,
|
&mut self,
|
||||||
move_out_indices: Vec<MoveOutIndex>,
|
move_out_indices: Vec<MoveOutIndex>,
|
||||||
place_and_err: (PlaceRef<'tcx>, Diag<'infcx>),
|
place_and_err: (PlaceRef<'tcx>, Diag<'infcx>),
|
||||||
@ -2510,16 +2511,19 @@ pub fn buffer_move_error(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_buffered_mut_error(&mut self, span: Span) -> Option<(Diag<'infcx>, usize)> {
|
pub(crate) fn get_buffered_mut_error(
|
||||||
|
&mut self,
|
||||||
|
span: Span,
|
||||||
|
) -> Option<(Diag<'infcx>, usize)> {
|
||||||
// FIXME(#120456) - is `swap_remove` correct?
|
// FIXME(#120456) - is `swap_remove` correct?
|
||||||
self.diags.buffered_mut_errors.swap_remove(&span)
|
self.diags.buffered_mut_errors.swap_remove(&span)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn buffer_mut_error(&mut self, span: Span, diag: Diag<'infcx>, count: usize) {
|
pub(crate) fn buffer_mut_error(&mut self, span: Span, diag: Diag<'infcx>, count: usize) {
|
||||||
self.diags.buffered_mut_errors.insert(span, (diag, count));
|
self.diags.buffered_mut_errors.insert(span, (diag, count));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn emit_errors(&mut self) -> Option<ErrorGuaranteed> {
|
pub(crate) fn emit_errors(&mut self) -> Option<ErrorGuaranteed> {
|
||||||
let mut res = None;
|
let mut res = None;
|
||||||
|
|
||||||
// Buffer any move errors that we collected and de-duplicated.
|
// Buffer any move errors that we collected and de-duplicated.
|
||||||
@ -2553,7 +2557,7 @@ pub(crate) fn has_buffered_diags(&self) -> bool {
|
|||||||
self.diags.buffered_diags.is_empty()
|
self.diags.buffered_diags.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn has_move_error(
|
pub(crate) fn has_move_error(
|
||||||
&self,
|
&self,
|
||||||
move_out_indices: &[MoveOutIndex],
|
move_out_indices: &[MoveOutIndex],
|
||||||
) -> Option<&(PlaceRef<'tcx>, Diag<'infcx>)> {
|
) -> Option<&(PlaceRef<'tcx>, Diag<'infcx>)> {
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
use super::MirBorrowckCtxt;
|
use super::MirBorrowckCtxt;
|
||||||
|
|
||||||
pub trait IsPrefixOf<'tcx> {
|
pub(crate) trait IsPrefixOf<'tcx> {
|
||||||
fn is_prefix_of(&self, other: PlaceRef<'tcx>) -> bool;
|
fn is_prefix_of(&self, other: PlaceRef<'tcx>) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,9 +42,9 @@
|
|||||||
mod opaque_types;
|
mod opaque_types;
|
||||||
mod reverse_sccs;
|
mod reverse_sccs;
|
||||||
|
|
||||||
pub mod values;
|
pub(crate) mod values;
|
||||||
|
|
||||||
pub type ConstraintSccs = Sccs<RegionVid, ConstraintSccIndex, RegionTracker>;
|
pub(crate) type ConstraintSccs = Sccs<RegionVid, ConstraintSccIndex, RegionTracker>;
|
||||||
|
|
||||||
/// An annotation for region graph SCCs that tracks
|
/// An annotation for region graph SCCs that tracks
|
||||||
/// the values of its elements.
|
/// the values of its elements.
|
||||||
@ -226,7 +226,7 @@ pub(crate) struct AppliedMemberConstraint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct RegionDefinition<'tcx> {
|
pub(crate) struct RegionDefinition<'tcx> {
|
||||||
/// What kind of variable is this -- a free region? existential
|
/// What kind of variable is this -- a free region? existential
|
||||||
/// variable? etc. (See the `NllRegionVariableOrigin` for more
|
/// variable? etc. (See the `NllRegionVariableOrigin` for more
|
||||||
/// info.)
|
/// info.)
|
||||||
@ -288,7 +288,7 @@ pub(crate) enum Cause {
|
|||||||
/// `InferCtxt::process_registered_region_obligations` and
|
/// `InferCtxt::process_registered_region_obligations` and
|
||||||
/// `InferCtxt::type_must_outlive` in `rustc_infer::infer::InferCtxt`.
|
/// `InferCtxt::type_must_outlive` in `rustc_infer::infer::InferCtxt`.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct TypeTest<'tcx> {
|
pub(crate) struct TypeTest<'tcx> {
|
||||||
/// The type `T` that must outlive the region.
|
/// The type `T` that must outlive the region.
|
||||||
pub generic_kind: GenericKind<'tcx>,
|
pub generic_kind: GenericKind<'tcx>,
|
||||||
|
|
||||||
@ -320,7 +320,7 @@ enum Trace<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
pub enum ExtraConstraintInfo {
|
pub(crate) enum ExtraConstraintInfo {
|
||||||
PlaceholderFromPredicate(Span),
|
PlaceholderFromPredicate(Span),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2259,7 +2259,7 @@ fn new(universe: ty::UniverseIndex, rv_origin: RegionVariableOrigin) -> Self {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct BlameConstraint<'tcx> {
|
pub(crate) struct BlameConstraint<'tcx> {
|
||||||
pub category: ConstraintCategory<'tcx>,
|
pub category: ConstraintCategory<'tcx>,
|
||||||
pub from_closure: bool,
|
pub from_closure: bool,
|
||||||
pub cause: ObligationCause<'tcx>,
|
pub cause: ObligationCause<'tcx>,
|
||||||
|
@ -473,20 +473,20 @@ struct LazyOpaqueTyEnv<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> LazyOpaqueTyEnv<'tcx> {
|
impl<'tcx> LazyOpaqueTyEnv<'tcx> {
|
||||||
pub fn new(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Self {
|
fn new(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Self {
|
||||||
Self { tcx, def_id, canonical_args: std::cell::OnceCell::new() }
|
Self { tcx, def_id, canonical_args: std::cell::OnceCell::new() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn param_equal_static(&self, param_index: usize) -> bool {
|
fn param_equal_static(&self, param_index: usize) -> bool {
|
||||||
self.get_canonical_args()[param_index].expect_region().is_static()
|
self.get_canonical_args()[param_index].expect_region().is_static()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn params_equal(&self, param1: usize, param2: usize) -> bool {
|
fn params_equal(&self, param1: usize, param2: usize) -> bool {
|
||||||
let canonical_args = self.get_canonical_args();
|
let canonical_args = self.get_canonical_args();
|
||||||
canonical_args[param1] == canonical_args[param2]
|
canonical_args[param1] == canonical_args[param2]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn param_is_error(&self, param_index: usize) -> Result<(), ErrorGuaranteed> {
|
fn param_is_error(&self, param_index: usize) -> Result<(), ErrorGuaranteed> {
|
||||||
self.get_canonical_args()[param_index].error_reported()
|
self.get_canonical_args()[param_index].error_reported()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ macro_rules! span_mirbug_and_err {
|
|||||||
|
|
||||||
mod canonical;
|
mod canonical;
|
||||||
mod constraint_conversion;
|
mod constraint_conversion;
|
||||||
pub mod free_region_relations;
|
pub(crate) mod free_region_relations;
|
||||||
mod input_output;
|
mod input_output;
|
||||||
pub(crate) mod liveness;
|
pub(crate) mod liveness;
|
||||||
mod relate_tys;
|
mod relate_tys;
|
||||||
|
@ -57,7 +57,7 @@ pub(super) fn eq_args(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct NllTypeRelating<'me, 'bccx, 'tcx> {
|
struct NllTypeRelating<'me, 'bccx, 'tcx> {
|
||||||
type_checker: &'me mut TypeChecker<'bccx, 'tcx>,
|
type_checker: &'me mut TypeChecker<'bccx, 'tcx>,
|
||||||
|
|
||||||
/// Where (and why) is this relation taking place?
|
/// Where (and why) is this relation taking place?
|
||||||
@ -82,7 +82,7 @@ pub struct NllTypeRelating<'me, 'bccx, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'me, 'bccx, 'tcx> NllTypeRelating<'me, 'bccx, 'tcx> {
|
impl<'me, 'bccx, 'tcx> NllTypeRelating<'me, 'bccx, 'tcx> {
|
||||||
pub fn new(
|
fn new(
|
||||||
type_checker: &'me mut TypeChecker<'bccx, 'tcx>,
|
type_checker: &'me mut TypeChecker<'bccx, 'tcx>,
|
||||||
locations: Locations,
|
locations: Locations,
|
||||||
category: ConstraintCategory<'tcx>,
|
category: ConstraintCategory<'tcx>,
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
use crate::BorrowckInferCtxt;
|
use crate::BorrowckInferCtxt;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct UniversalRegions<'tcx> {
|
pub(crate) struct UniversalRegions<'tcx> {
|
||||||
indices: UniversalRegionIndices<'tcx>,
|
indices: UniversalRegionIndices<'tcx>,
|
||||||
|
|
||||||
/// The vid assigned to `'static`
|
/// The vid assigned to `'static`
|
||||||
@ -95,7 +95,7 @@ pub struct UniversalRegions<'tcx> {
|
|||||||
/// regions appear free in the defining type and late-bound regions
|
/// regions appear free in the defining type and late-bound regions
|
||||||
/// appear bound in the signature.
|
/// appear bound in the signature.
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub enum DefiningTy<'tcx> {
|
pub(crate) enum DefiningTy<'tcx> {
|
||||||
/// The MIR is a closure. The signature is found via
|
/// The MIR is a closure. The signature is found via
|
||||||
/// `ClosureArgs::closure_sig_ty`.
|
/// `ClosureArgs::closure_sig_ty`.
|
||||||
Closure(DefId, GenericArgsRef<'tcx>),
|
Closure(DefId, GenericArgsRef<'tcx>),
|
||||||
@ -131,7 +131,7 @@ impl<'tcx> DefiningTy<'tcx> {
|
|||||||
/// not a closure or coroutine, there are no upvars, and hence it
|
/// not a closure or coroutine, there are no upvars, and hence it
|
||||||
/// will be an empty list. The order of types in this list will
|
/// will be an empty list. The order of types in this list will
|
||||||
/// match up with the upvar order in the HIR, typesystem, and MIR.
|
/// match up with the upvar order in the HIR, typesystem, and MIR.
|
||||||
pub fn upvar_tys(self) -> &'tcx ty::List<Ty<'tcx>> {
|
pub(crate) fn upvar_tys(self) -> &'tcx ty::List<Ty<'tcx>> {
|
||||||
match self {
|
match self {
|
||||||
DefiningTy::Closure(_, args) => args.as_closure().upvar_tys(),
|
DefiningTy::Closure(_, args) => args.as_closure().upvar_tys(),
|
||||||
DefiningTy::CoroutineClosure(_, args) => args.as_coroutine_closure().upvar_tys(),
|
DefiningTy::CoroutineClosure(_, args) => args.as_coroutine_closure().upvar_tys(),
|
||||||
@ -145,7 +145,7 @@ pub fn upvar_tys(self) -> &'tcx ty::List<Ty<'tcx>> {
|
|||||||
/// Number of implicit inputs -- notably the "environment"
|
/// Number of implicit inputs -- notably the "environment"
|
||||||
/// parameter for closures -- that appear in MIR but not in the
|
/// parameter for closures -- that appear in MIR but not in the
|
||||||
/// user's code.
|
/// user's code.
|
||||||
pub fn implicit_inputs(self) -> usize {
|
pub(crate) fn implicit_inputs(self) -> usize {
|
||||||
match self {
|
match self {
|
||||||
DefiningTy::Closure(..)
|
DefiningTy::Closure(..)
|
||||||
| DefiningTy::CoroutineClosure(..)
|
| DefiningTy::CoroutineClosure(..)
|
||||||
@ -154,15 +154,15 @@ pub fn implicit_inputs(self) -> usize {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_fn_def(&self) -> bool {
|
pub(crate) fn is_fn_def(&self) -> bool {
|
||||||
matches!(*self, DefiningTy::FnDef(..))
|
matches!(*self, DefiningTy::FnDef(..))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_const(&self) -> bool {
|
pub(crate) fn is_const(&self) -> bool {
|
||||||
matches!(*self, DefiningTy::Const(..) | DefiningTy::InlineConst(..))
|
matches!(*self, DefiningTy::Const(..) | DefiningTy::InlineConst(..))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn def_id(&self) -> DefId {
|
pub(crate) fn def_id(&self) -> DefId {
|
||||||
match *self {
|
match *self {
|
||||||
DefiningTy::Closure(def_id, ..)
|
DefiningTy::Closure(def_id, ..)
|
||||||
| DefiningTy::CoroutineClosure(def_id, ..)
|
| DefiningTy::CoroutineClosure(def_id, ..)
|
||||||
@ -196,7 +196,7 @@ struct UniversalRegionIndices<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum RegionClassification {
|
pub(crate) enum RegionClassification {
|
||||||
/// A **global** region is one that can be named from
|
/// A **global** region is one that can be named from
|
||||||
/// anywhere. There is only one, `'static`.
|
/// anywhere. There is only one, `'static`.
|
||||||
Global,
|
Global,
|
||||||
@ -246,7 +246,7 @@ impl<'tcx> UniversalRegions<'tcx> {
|
|||||||
/// MIR -- that is, all the regions that appear in the function's
|
/// MIR -- that is, all the regions that appear in the function's
|
||||||
/// signature. This will also compute the relationships that are
|
/// signature. This will also compute the relationships that are
|
||||||
/// known between those regions.
|
/// known between those regions.
|
||||||
pub fn new(
|
pub(crate) fn new(
|
||||||
infcx: &BorrowckInferCtxt<'tcx>,
|
infcx: &BorrowckInferCtxt<'tcx>,
|
||||||
mir_def: LocalDefId,
|
mir_def: LocalDefId,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
@ -263,7 +263,7 @@ pub fn new(
|
|||||||
/// if the `ClosureRegionRequirements` contains something like
|
/// if the `ClosureRegionRequirements` contains something like
|
||||||
/// `'1: '2`, then the caller would impose the constraint that
|
/// `'1: '2`, then the caller would impose the constraint that
|
||||||
/// `V[1]: V[2]`.
|
/// `V[1]: V[2]`.
|
||||||
pub fn closure_mapping(
|
pub(crate) fn closure_mapping(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
closure_args: GenericArgsRef<'tcx>,
|
closure_args: GenericArgsRef<'tcx>,
|
||||||
expected_num_vars: usize,
|
expected_num_vars: usize,
|
||||||
@ -289,13 +289,13 @@ pub fn closure_mapping(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if `r` is a member of this set of universal regions.
|
/// Returns `true` if `r` is a member of this set of universal regions.
|
||||||
pub fn is_universal_region(&self, r: RegionVid) -> bool {
|
pub(crate) fn is_universal_region(&self, r: RegionVid) -> bool {
|
||||||
(FIRST_GLOBAL_INDEX..self.num_universals).contains(&r.index())
|
(FIRST_GLOBAL_INDEX..self.num_universals).contains(&r.index())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Classifies `r` as a universal region, returning `None` if this
|
/// Classifies `r` as a universal region, returning `None` if this
|
||||||
/// is not a member of this set of universal regions.
|
/// is not a member of this set of universal regions.
|
||||||
pub fn region_classification(&self, r: RegionVid) -> Option<RegionClassification> {
|
pub(crate) fn region_classification(&self, r: RegionVid) -> Option<RegionClassification> {
|
||||||
let index = r.index();
|
let index = r.index();
|
||||||
if (FIRST_GLOBAL_INDEX..self.first_extern_index).contains(&index) {
|
if (FIRST_GLOBAL_INDEX..self.first_extern_index).contains(&index) {
|
||||||
Some(RegionClassification::Global)
|
Some(RegionClassification::Global)
|
||||||
@ -310,17 +310,17 @@ pub fn region_classification(&self, r: RegionVid) -> Option<RegionClassification
|
|||||||
|
|
||||||
/// Returns an iterator over all the RegionVids corresponding to
|
/// Returns an iterator over all the RegionVids corresponding to
|
||||||
/// universally quantified free regions.
|
/// universally quantified free regions.
|
||||||
pub fn universal_regions(&self) -> impl Iterator<Item = RegionVid> {
|
pub(crate) fn universal_regions(&self) -> impl Iterator<Item = RegionVid> {
|
||||||
(FIRST_GLOBAL_INDEX..self.num_universals).map(RegionVid::from_usize)
|
(FIRST_GLOBAL_INDEX..self.num_universals).map(RegionVid::from_usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if `r` is classified as a local region.
|
/// Returns `true` if `r` is classified as a local region.
|
||||||
pub fn is_local_free_region(&self, r: RegionVid) -> bool {
|
pub(crate) fn is_local_free_region(&self, r: RegionVid) -> bool {
|
||||||
self.region_classification(r) == Some(RegionClassification::Local)
|
self.region_classification(r) == Some(RegionClassification::Local)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the number of universal regions created in any category.
|
/// Returns the number of universal regions created in any category.
|
||||||
pub fn len(&self) -> usize {
|
pub(crate) fn len(&self) -> usize {
|
||||||
self.num_universals
|
self.num_universals
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,19 +329,19 @@ pub fn len(&self) -> usize {
|
|||||||
/// closure type (versus those bound in the closure
|
/// closure type (versus those bound in the closure
|
||||||
/// signature). They are therefore the regions between which the
|
/// signature). They are therefore the regions between which the
|
||||||
/// closure may impose constraints that its creator must verify.
|
/// closure may impose constraints that its creator must verify.
|
||||||
pub fn num_global_and_external_regions(&self) -> usize {
|
pub(crate) fn num_global_and_external_regions(&self) -> usize {
|
||||||
self.first_local_index
|
self.first_local_index
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets an iterator over all the early-bound regions that have names.
|
/// Gets an iterator over all the early-bound regions that have names.
|
||||||
pub fn named_universal_regions<'s>(
|
pub(crate) fn named_universal_regions<'s>(
|
||||||
&'s self,
|
&'s self,
|
||||||
) -> impl Iterator<Item = (ty::Region<'tcx>, ty::RegionVid)> + 's {
|
) -> impl Iterator<Item = (ty::Region<'tcx>, ty::RegionVid)> + 's {
|
||||||
self.indices.indices.iter().map(|(&r, &v)| (r, v))
|
self.indices.indices.iter().map(|(&r, &v)| (r, v))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// See `UniversalRegionIndices::to_region_vid`.
|
/// See `UniversalRegionIndices::to_region_vid`.
|
||||||
pub fn to_region_vid(&self, r: ty::Region<'tcx>) -> RegionVid {
|
pub(crate) fn to_region_vid(&self, r: ty::Region<'tcx>) -> RegionVid {
|
||||||
self.indices.to_region_vid(r)
|
self.indices.to_region_vid(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,7 +416,7 @@ pub(crate) fn annotate(&self, tcx: TyCtxt<'tcx>, err: &mut Diag<'_, ()>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn tainted_by_errors(&self) -> Option<ErrorGuaranteed> {
|
pub(crate) fn tainted_by_errors(&self) -> Option<ErrorGuaranteed> {
|
||||||
self.indices.tainted_by_errors.get()
|
self.indices.tainted_by_errors.get()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -880,7 +880,7 @@ fn insert_late_bound_region(&mut self, r: ty::Region<'tcx>, vid: ty::RegionVid)
|
|||||||
/// reference those regions from the `ParamEnv`. It is also used
|
/// reference those regions from the `ParamEnv`. It is also used
|
||||||
/// during initialization. Relies on the `indices` map having been
|
/// during initialization. Relies on the `indices` map having been
|
||||||
/// fully initialized.
|
/// fully initialized.
|
||||||
pub fn to_region_vid(&self, r: ty::Region<'tcx>) -> RegionVid {
|
fn to_region_vid(&self, r: ty::Region<'tcx>) -> RegionVid {
|
||||||
if let ty::ReVar(..) = *r {
|
if let ty::ReVar(..) = *r {
|
||||||
r.as_var()
|
r.as_var()
|
||||||
} else if let ty::ReError(guar) = *r {
|
} else if let ty::ReError(guar) = *r {
|
||||||
@ -899,7 +899,7 @@ pub fn to_region_vid(&self, r: ty::Region<'tcx>) -> RegionVid {
|
|||||||
|
|
||||||
/// Replaces all free regions in `value` with region vids, as
|
/// Replaces all free regions in `value` with region vids, as
|
||||||
/// returned by `to_region_vid`.
|
/// returned by `to_region_vid`.
|
||||||
pub fn fold_to_region_vids<T>(&self, tcx: TyCtxt<'tcx>, value: T) -> T
|
fn fold_to_region_vids<T>(&self, tcx: TyCtxt<'tcx>, value: T) -> T
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use rustc_middle::mir::visit::{PlaceContext, Visitor};
|
use rustc_middle::mir::visit::{PlaceContext, Visitor};
|
||||||
use rustc_middle::mir::{Body, Local, Location};
|
use rustc_middle::mir::{Body, Local, Location};
|
||||||
|
|
||||||
pub trait FindAssignments {
|
pub(crate) trait FindAssignments {
|
||||||
// Finds all statements that assign directly to local (i.e., X = ...)
|
// Finds all statements that assign directly to local (i.e., X = ...)
|
||||||
// and returns their locations.
|
// and returns their locations.
|
||||||
fn find_assignments(&self, local: Local) -> Vec<Location>;
|
fn find_assignments(&self, local: Local) -> Vec<Location>;
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
mod collect_writes;
|
mod collect_writes;
|
||||||
|
|
||||||
pub use collect_writes::FindAssignments;
|
pub(crate) use collect_writes::FindAssignments;
|
||||||
|
Loading…
Reference in New Issue
Block a user