mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
small opaque_type_origin
cleanup
This commit is contained in:
parent
267cd1d2c5
commit
f97a8f017d
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user