1
Fork 0

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:
Matthias Krüger 2025-03-01 11:34:00 +01:00 committed by GitHub
commit 1d9992d4d2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 21 additions and 37 deletions

View file

@ -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))
}

View file

@ -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.

View file

@ -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))
} }
} }
} }

View file

@ -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]