Move opaque_type_origin_unchecked
onto TyCtxt
and re-use it where it was open coded
This commit is contained in:
parent
fa06a371b7
commit
c8979e587b
6 changed files with 14 additions and 15 deletions
|
@ -563,8 +563,8 @@ fn check_item_type(tcx: TyCtxt<'_>, id: hir::ItemId) {
|
||||||
check_union(tcx, id.owner_id.def_id);
|
check_union(tcx, id.owner_id.def_id);
|
||||||
}
|
}
|
||||||
DefKind::OpaqueTy => {
|
DefKind::OpaqueTy => {
|
||||||
let opaque = tcx.hir().expect_item(id.owner_id.def_id).expect_opaque_ty();
|
let origin = tcx.opaque_type_origin(id.owner_id.def_id);
|
||||||
if let hir::OpaqueTyOrigin::FnReturn(fn_def_id) | hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = opaque.origin
|
if let hir::OpaqueTyOrigin::FnReturn(fn_def_id) | hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = origin
|
||||||
&& let hir::Node::TraitItem(trait_item) = tcx.hir().get_by_def_id(fn_def_id)
|
&& let hir::Node::TraitItem(trait_item) = tcx.hir().get_by_def_id(fn_def_id)
|
||||||
&& let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn()
|
&& let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1543,8 +1543,8 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for ImplTraitInTraitFinder<'_, 'tcx> {
|
||||||
if let ty::Alias(ty::Opaque, unshifted_opaque_ty) = *ty.kind()
|
if let ty::Alias(ty::Opaque, unshifted_opaque_ty) = *ty.kind()
|
||||||
&& self.seen.insert(unshifted_opaque_ty.def_id)
|
&& self.seen.insert(unshifted_opaque_ty.def_id)
|
||||||
&& let Some(opaque_def_id) = unshifted_opaque_ty.def_id.as_local()
|
&& let Some(opaque_def_id) = unshifted_opaque_ty.def_id.as_local()
|
||||||
&& let opaque = tcx.hir().expect_item(opaque_def_id).expect_opaque_ty()
|
&& let origin = tcx.opaque_type_origin(opaque_def_id)
|
||||||
&& let hir::OpaqueTyOrigin::FnReturn(source) | hir::OpaqueTyOrigin::AsyncFn(source) = opaque.origin
|
&& let hir::OpaqueTyOrigin::FnReturn(source) | hir::OpaqueTyOrigin::AsyncFn(source) = origin
|
||||||
&& source == self.fn_def_id
|
&& source == self.fn_def_id
|
||||||
{
|
{
|
||||||
let opaque_ty = tcx.fold_regions(unshifted_opaque_ty, |re, _depth| {
|
let opaque_ty = tcx.fold_regions(unshifted_opaque_ty, |re, _depth| {
|
||||||
|
|
|
@ -378,7 +378,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
DefiningAnchor::Bind(bind) => bind,
|
DefiningAnchor::Bind(bind) => bind,
|
||||||
};
|
};
|
||||||
|
|
||||||
let origin = self.opaque_type_origin_unchecked(def_id);
|
let origin = self.tcx.opaque_type_origin(def_id);
|
||||||
let in_definition_scope = match origin {
|
let in_definition_scope = match origin {
|
||||||
// Async `impl Trait`
|
// Async `impl Trait`
|
||||||
hir::OpaqueTyOrigin::AsyncFn(parent) => parent == parent_def_id,
|
hir::OpaqueTyOrigin::AsyncFn(parent) => parent == parent_def_id,
|
||||||
|
@ -395,13 +395,6 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
};
|
};
|
||||||
in_definition_scope.then_some(origin)
|
in_definition_scope.then_some(origin)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the origin of the opaque type `def_id` even if we are not in its
|
|
||||||
/// defining scope.
|
|
||||||
#[instrument(skip(self), level = "trace", ret)]
|
|
||||||
fn opaque_type_origin_unchecked(&self, def_id: LocalDefId) -> OpaqueTyOrigin {
|
|
||||||
self.tcx.hir().expect_item(def_id).expect_opaque_ty().origin
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Visitor that requires that (almost) all regions in the type visited outlive
|
/// Visitor that requires that (almost) all regions in the type visited outlive
|
||||||
|
|
|
@ -1138,8 +1138,8 @@ fn should_encode_type(tcx: TyCtxt<'_>, def_id: LocalDefId, def_kind: DefKind) ->
|
||||||
| DefKind::InlineConst => true,
|
| DefKind::InlineConst => true,
|
||||||
|
|
||||||
DefKind::OpaqueTy => {
|
DefKind::OpaqueTy => {
|
||||||
let opaque = tcx.hir().expect_item(def_id).expect_opaque_ty();
|
let origin = tcx.opaque_type_origin(def_id);
|
||||||
if let hir::OpaqueTyOrigin::FnReturn(fn_def_id) | hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = opaque.origin
|
if let hir::OpaqueTyOrigin::FnReturn(fn_def_id) | hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = origin
|
||||||
&& let hir::Node::TraitItem(trait_item) = tcx.hir().get_by_def_id(fn_def_id)
|
&& let hir::Node::TraitItem(trait_item) = tcx.hir().get_by_def_id(fn_def_id)
|
||||||
&& let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn()
|
&& let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1189,6 +1189,12 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
pub fn local_visibility(self, def_id: LocalDefId) -> Visibility {
|
pub fn local_visibility(self, def_id: LocalDefId) -> Visibility {
|
||||||
self.visibility(def_id).expect_local()
|
self.visibility(def_id).expect_local()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the origin of the opaque type `def_id`.
|
||||||
|
#[instrument(skip(self), level = "trace", ret)]
|
||||||
|
pub fn opaque_type_origin(self, def_id: LocalDefId) -> hir::OpaqueTyOrigin {
|
||||||
|
self.hir().expect_item(def_id).expect_opaque_ty().origin
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A trait implemented for all `X<'a>` types that can be safely and
|
/// A trait implemented for all `X<'a>` types that can be safely and
|
||||||
|
|
|
@ -259,7 +259,7 @@ fn associated_type_for_impl_trait_in_trait(
|
||||||
opaque_ty_def_id: LocalDefId,
|
opaque_ty_def_id: LocalDefId,
|
||||||
) -> LocalDefId {
|
) -> LocalDefId {
|
||||||
let (hir::OpaqueTyOrigin::FnReturn(fn_def_id) | hir::OpaqueTyOrigin::AsyncFn(fn_def_id)) =
|
let (hir::OpaqueTyOrigin::FnReturn(fn_def_id) | hir::OpaqueTyOrigin::AsyncFn(fn_def_id)) =
|
||||||
tcx.hir().expect_item(opaque_ty_def_id).expect_opaque_ty().origin
|
tcx.opaque_type_origin(opaque_ty_def_id)
|
||||||
else {
|
else {
|
||||||
bug!("expected opaque for {opaque_ty_def_id:?}");
|
bug!("expected opaque for {opaque_ty_def_id:?}");
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue