Rollup merge of #137763 - compiler-errors:ty-nits, r=BoxyUwU
Use `mk_ty_from_kind` a bit less, clean up lifetime handling in borrowck r? ``@BoxyUwU`` Pulled out of my attempt to turn that `*const dyn Tr + '_` casting into a lint (which failed lmao)
This commit is contained in:
commit
1d9992d4d2
4 changed files with 21 additions and 37 deletions
|
@ -38,7 +38,7 @@ use rustc_mir_dataflow::move_paths::MoveData;
|
||||||
use rustc_mir_dataflow::points::DenseLocationMap;
|
use rustc_mir_dataflow::points::DenseLocationMap;
|
||||||
use rustc_span::def_id::CRATE_DEF_ID;
|
use rustc_span::def_id::CRATE_DEF_ID;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_span::{DUMMY_SP, Span, sym};
|
use rustc_span::{Span, sym};
|
||||||
use rustc_trait_selection::traits::query::type_op::custom::scrape_region_constraints;
|
use rustc_trait_selection::traits::query::type_op::custom::scrape_region_constraints;
|
||||||
use rustc_trait_selection::traits::query::type_op::{TypeOp, TypeOpOutput};
|
use rustc_trait_selection::traits::query::type_op::{TypeOp, TypeOpOutput};
|
||||||
use tracing::{debug, instrument, trace};
|
use tracing::{debug, instrument, trace};
|
||||||
|
@ -51,7 +51,6 @@ use crate::polonius::legacy::{PoloniusFacts, PoloniusLocationTable};
|
||||||
use crate::polonius::{PoloniusContext, PoloniusLivenessContext};
|
use crate::polonius::{PoloniusContext, PoloniusLivenessContext};
|
||||||
use crate::region_infer::TypeTest;
|
use crate::region_infer::TypeTest;
|
||||||
use crate::region_infer::values::{LivenessValues, PlaceholderIndex, PlaceholderIndices};
|
use crate::region_infer::values::{LivenessValues, PlaceholderIndex, PlaceholderIndices};
|
||||||
use crate::renumber::RegionCtxt;
|
|
||||||
use crate::session_diagnostics::{MoveUnsized, SimdIntrinsicArgConst};
|
use crate::session_diagnostics::{MoveUnsized, SimdIntrinsicArgConst};
|
||||||
use crate::type_check::free_region_relations::{CreateResult, UniversalRegionRelations};
|
use crate::type_check::free_region_relations::{CreateResult, UniversalRegionRelations};
|
||||||
use crate::universal_regions::{DefiningTy, UniversalRegions};
|
use crate::universal_regions::{DefiningTy, UniversalRegions};
|
||||||
|
@ -2121,35 +2120,31 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||||
//
|
//
|
||||||
// Note that other checks (such as denying `dyn Send` -> `dyn
|
// Note that other checks (such as denying `dyn Send` -> `dyn
|
||||||
// Debug`) are in `rustc_hir_typeck`.
|
// Debug`) are in `rustc_hir_typeck`.
|
||||||
if let ty::Dynamic(src_tty, ..) = src_tail.kind()
|
if let ty::Dynamic(src_tty, _src_lt, _) = *src_tail.kind()
|
||||||
&& let ty::Dynamic(dst_tty, ..) = dst_tail.kind()
|
&& let ty::Dynamic(dst_tty, dst_lt, _) = *dst_tail.kind()
|
||||||
&& src_tty.principal().is_some()
|
&& src_tty.principal().is_some()
|
||||||
&& dst_tty.principal().is_some()
|
&& dst_tty.principal().is_some()
|
||||||
{
|
{
|
||||||
// Remove auto traits.
|
// Remove auto traits.
|
||||||
// Auto trait checks are handled in `rustc_hir_typeck` as FCW.
|
// Auto trait checks are handled in `rustc_hir_typeck` as FCW.
|
||||||
let src_obj = tcx.mk_ty_from_kind(ty::Dynamic(
|
let src_obj = Ty::new_dynamic(
|
||||||
|
tcx,
|
||||||
tcx.mk_poly_existential_predicates(
|
tcx.mk_poly_existential_predicates(
|
||||||
&src_tty.without_auto_traits().collect::<Vec<_>>(),
|
&src_tty.without_auto_traits().collect::<Vec<_>>(),
|
||||||
),
|
),
|
||||||
tcx.lifetimes.re_static,
|
// FIXME: Once we disallow casting `*const dyn Trait + 'short`
|
||||||
|
// to `*const dyn Trait + 'long`, then this can just be `src_lt`.
|
||||||
|
dst_lt,
|
||||||
ty::Dyn,
|
ty::Dyn,
|
||||||
));
|
);
|
||||||
let dst_obj = tcx.mk_ty_from_kind(ty::Dynamic(
|
let dst_obj = Ty::new_dynamic(
|
||||||
|
tcx,
|
||||||
tcx.mk_poly_existential_predicates(
|
tcx.mk_poly_existential_predicates(
|
||||||
&dst_tty.without_auto_traits().collect::<Vec<_>>(),
|
&dst_tty.without_auto_traits().collect::<Vec<_>>(),
|
||||||
),
|
),
|
||||||
tcx.lifetimes.re_static,
|
dst_lt,
|
||||||
ty::Dyn,
|
ty::Dyn,
|
||||||
));
|
);
|
||||||
|
|
||||||
// Replace trait object lifetimes with fresh vars, to allow
|
|
||||||
// casts like
|
|
||||||
// `*mut dyn FnOnce() + 'a` -> `*mut dyn FnOnce() + 'static`
|
|
||||||
let src_obj =
|
|
||||||
freshen_single_trait_object_lifetime(self.infcx, src_obj);
|
|
||||||
let dst_obj =
|
|
||||||
freshen_single_trait_object_lifetime(self.infcx, dst_obj);
|
|
||||||
|
|
||||||
debug!(?src_tty, ?dst_tty, ?src_obj, ?dst_obj);
|
debug!(?src_tty, ?dst_tty, ?src_obj, ?dst_obj);
|
||||||
|
|
||||||
|
@ -2707,16 +2702,3 @@ impl<'tcx> TypeOp<'tcx> for InstantiateOpaqueType<'tcx> {
|
||||||
Ok(output)
|
Ok(output)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn freshen_single_trait_object_lifetime<'tcx>(
|
|
||||||
infcx: &BorrowckInferCtxt<'tcx>,
|
|
||||||
ty: Ty<'tcx>,
|
|
||||||
) -> Ty<'tcx> {
|
|
||||||
let &ty::Dynamic(tty, _, dyn_kind @ ty::Dyn) = ty.kind() else { bug!("expected trait object") };
|
|
||||||
|
|
||||||
let fresh = infcx
|
|
||||||
.next_region_var(rustc_infer::infer::RegionVariableOrigin::MiscVariable(DUMMY_SP), || {
|
|
||||||
RegionCtxt::Unknown
|
|
||||||
});
|
|
||||||
infcx.tcx.mk_ty_from_kind(ty::Dynamic(tty, fresh, dyn_kind))
|
|
||||||
}
|
|
||||||
|
|
|
@ -895,20 +895,22 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||||
// e.g. we want to allow `dyn T -> (dyn T,)`, etc.
|
// e.g. we want to allow `dyn T -> (dyn T,)`, etc.
|
||||||
//
|
//
|
||||||
// We also need to skip auto traits to emit an FCW and not an error.
|
// We also need to skip auto traits to emit an FCW and not an error.
|
||||||
let src_obj = tcx.mk_ty_from_kind(ty::Dynamic(
|
let src_obj = Ty::new_dynamic(
|
||||||
|
tcx,
|
||||||
tcx.mk_poly_existential_predicates(
|
tcx.mk_poly_existential_predicates(
|
||||||
&src_tty.without_auto_traits().collect::<Vec<_>>(),
|
&src_tty.without_auto_traits().collect::<Vec<_>>(),
|
||||||
),
|
),
|
||||||
tcx.lifetimes.re_erased,
|
tcx.lifetimes.re_erased,
|
||||||
ty::Dyn,
|
ty::Dyn,
|
||||||
));
|
);
|
||||||
let dst_obj = tcx.mk_ty_from_kind(ty::Dynamic(
|
let dst_obj = Ty::new_dynamic(
|
||||||
|
tcx,
|
||||||
tcx.mk_poly_existential_predicates(
|
tcx.mk_poly_existential_predicates(
|
||||||
&dst_tty.without_auto_traits().collect::<Vec<_>>(),
|
&dst_tty.without_auto_traits().collect::<Vec<_>>(),
|
||||||
),
|
),
|
||||||
tcx.lifetimes.re_erased,
|
tcx.lifetimes.re_erased,
|
||||||
ty::Dyn,
|
ty::Dyn,
|
||||||
));
|
);
|
||||||
|
|
||||||
// `dyn Src = dyn Dst`, this checks for matching traits/generics/projections
|
// `dyn Src = dyn Dst`, this checks for matching traits/generics/projections
|
||||||
// This is `fcx.demand_eqtype`, but inlined to give a better error.
|
// This is `fcx.demand_eqtype`, but inlined to give a better error.
|
||||||
|
|
|
@ -224,7 +224,7 @@ impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<D> for Ty<'tcx> {
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
let tcx = decoder.interner();
|
let tcx = decoder.interner();
|
||||||
tcx.mk_ty_from_kind(rustc_type_ir::TyKind::decode(decoder))
|
tcx.mk_ty_from_kind(ty::TyKind::decode(decoder))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -462,7 +462,7 @@ impl<'tcx> Ty<'tcx> {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new_param(tcx: TyCtxt<'tcx>, index: u32, name: Symbol) -> Ty<'tcx> {
|
pub fn new_param(tcx: TyCtxt<'tcx>, index: u32, name: Symbol) -> Ty<'tcx> {
|
||||||
tcx.mk_ty_from_kind(Param(ParamTy { index, name }))
|
Ty::new(tcx, Param(ParamTy { index, name }))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue