small `opaque_type_origin` cleanup

This commit is contained in:
lcnr 2023-02-20 17:48:59 +01:00
parent 267cd1d2c5
commit f97a8f017d
2 changed files with 17 additions and 25 deletions

View File

@ -32,7 +32,7 @@ use rustc_session::lint;
use rustc_span::def_id::LocalDefId; use rustc_span::def_id::LocalDefId;
use rustc_span::hygiene::DesugaringKind; use rustc_span::hygiene::DesugaringKind;
use rustc_span::symbol::{kw, sym, Ident}; use rustc_span::symbol::{kw, sym, Ident};
use rustc_span::{Span, DUMMY_SP}; use rustc_span::Span;
use rustc_trait_selection::traits::error_reporting::TypeErrCtxtExt as _; use rustc_trait_selection::traits::error_reporting::TypeErrCtxtExt as _;
use rustc_trait_selection::traits::{self, NormalizeExt, ObligationCauseCode, ObligationCtxt}; use rustc_trait_selection::traits::{self, NormalizeExt, ObligationCauseCode, ObligationCtxt};
@ -737,7 +737,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let ty::subst::GenericArgKind::Type(ty) = ty.unpack() if let ty::subst::GenericArgKind::Type(ty) = ty.unpack()
&& let ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }) = *ty.kind() && let ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }) = *ty.kind()
&& let Some(def_id) = def_id.as_local() && let Some(def_id) = def_id.as_local()
&& self.opaque_type_origin(def_id, DUMMY_SP).is_some() { && self.opaque_type_origin(def_id).is_some() {
return None; return None;
} }
} }

View File

@ -57,9 +57,7 @@ impl<'tcx> InferCtxt<'tcx> {
} }
let mut obligations = vec![]; let mut obligations = vec![];
let replace_opaque_type = |def_id: DefId| { let replace_opaque_type = |def_id: DefId| {
def_id def_id.as_local().map_or(false, |def_id| self.opaque_type_origin(def_id).is_some())
.as_local()
.map_or(false, |def_id| self.opaque_type_origin(def_id, span).is_some())
}; };
let value = value.fold_with(&mut BottomUpFolder { let value = value.fold_with(&mut BottomUpFolder {
tcx: self.tcx, tcx: self.tcx,
@ -144,9 +142,9 @@ impl<'tcx> InferCtxt<'tcx> {
// let x = || foo(); // returns the Opaque assoc with `foo` // let x = || foo(); // returns the Opaque assoc with `foo`
// } // }
// ``` // ```
self.opaque_type_origin(def_id, cause.span)? self.opaque_type_origin(def_id)?
} }
DefiningAnchor::Bubble => self.opaque_ty_origin_unchecked(def_id, cause.span), DefiningAnchor::Bubble => self.opaque_type_origin_unchecked(def_id),
DefiningAnchor::Error => return None, DefiningAnchor::Error => return None,
}; };
if let ty::Alias(ty::Opaque, ty::AliasTy { def_id: b_def_id, .. }) = *b.kind() { if let ty::Alias(ty::Opaque, ty::AliasTy { def_id: b_def_id, .. }) = *b.kind() {
@ -155,9 +153,8 @@ impl<'tcx> InferCtxt<'tcx> {
// no one encounters it in practice. // no one encounters it in practice.
// It does occur however in `fn fut() -> impl Future<Output = i32> { async { 42 } }`, // It does occur however in `fn fut() -> impl Future<Output = i32> { async { 42 } }`,
// where it is of no concern, so we only check for TAITs. // where it is of no concern, so we only check for TAITs.
if let Some(OpaqueTyOrigin::TyAlias) = b_def_id if let Some(OpaqueTyOrigin::TyAlias) =
.as_local() b_def_id.as_local().and_then(|b_def_id| self.opaque_type_origin(b_def_id))
.and_then(|b_def_id| self.opaque_type_origin(b_def_id, cause.span))
{ {
self.tcx.sess.emit_err(OpaqueHiddenTypeDiag { self.tcx.sess.emit_err(OpaqueHiddenTypeDiag {
span: cause.span, span: cause.span,
@ -371,24 +368,18 @@ impl<'tcx> InferCtxt<'tcx> {
}); });
} }
/// Returns the origin of the opaque type `def_id` if we're currently
/// in its defining scope.
#[instrument(skip(self), level = "trace", ret)] #[instrument(skip(self), level = "trace", ret)]
pub fn opaque_type_origin(&self, def_id: LocalDefId, span: Span) -> Option<OpaqueTyOrigin> { pub fn opaque_type_origin(&self, def_id: LocalDefId) -> Option<OpaqueTyOrigin> {
let opaque_hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id); let opaque_hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id);
let parent_def_id = match self.defining_use_anchor { let parent_def_id = match self.defining_use_anchor {
DefiningAnchor::Bubble | DefiningAnchor::Error => return None, DefiningAnchor::Bubble | DefiningAnchor::Error => return None,
DefiningAnchor::Bind(bind) => bind, DefiningAnchor::Bind(bind) => bind,
}; };
let item_kind = &self.tcx.hir().expect_item(def_id).kind;
let hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) = item_kind else { let origin = self.opaque_type_origin_unchecked(def_id);
span_bug!( let in_definition_scope = match origin {
span,
"weird opaque type: {:#?}, {:#?}",
def_id,
item_kind
)
};
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,
// Anonymous `impl Trait` // Anonymous `impl Trait`
@ -398,16 +389,17 @@ impl<'tcx> InferCtxt<'tcx> {
may_define_opaque_type(self.tcx, parent_def_id, opaque_hir_id) may_define_opaque_type(self.tcx, parent_def_id, opaque_hir_id)
} }
}; };
trace!(?origin); 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)] #[instrument(skip(self), level = "trace", ret)]
fn opaque_ty_origin_unchecked(&self, def_id: LocalDefId, span: Span) -> OpaqueTyOrigin { fn opaque_type_origin_unchecked(&self, def_id: LocalDefId) -> OpaqueTyOrigin {
match self.tcx.hir().expect_item(def_id).kind { match self.tcx.hir().expect_item(def_id).kind {
hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => origin, hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => origin,
ref itemkind => { ref itemkind => {
span_bug!(span, "weird opaque type: {:?}, {:#?}", def_id, itemkind) bug!("weird opaque type: {:?}, {:#?}", def_id, itemkind)
} }
} }
} }