Use ty::OpaqueTy everywhere
This commit is contained in:
parent
918ede6474
commit
7f3af72606
55 changed files with 156 additions and 118 deletions
|
@ -697,8 +697,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
.map_bound(|p| p.predicates),
|
.map_bound(|p| p.predicates),
|
||||||
None,
|
None,
|
||||||
),
|
),
|
||||||
ty::Opaque(did, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
find_fn_kind_from_did(tcx.bound_explicit_item_bounds(*did), Some(*substs))
|
find_fn_kind_from_did(tcx.bound_explicit_item_bounds(*def_id), Some(*substs))
|
||||||
}
|
}
|
||||||
ty::Closure(_, substs) => match substs.as_closure().kind() {
|
ty::Closure(_, substs) => match substs.as_closure().kind() {
|
||||||
ty::ClosureKind::Fn => Some(hir::Mutability::Not),
|
ty::ClosureKind::Fn => Some(hir::Mutability::Not),
|
||||||
|
|
|
@ -504,7 +504,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
let ErrorConstraintInfo { outlived_fr, span, .. } = errci;
|
let ErrorConstraintInfo { outlived_fr, span, .. } = errci;
|
||||||
|
|
||||||
let mut output_ty = self.regioncx.universal_regions().unnormalized_output_ty;
|
let mut output_ty = self.regioncx.universal_regions().unnormalized_output_ty;
|
||||||
if let ty::Opaque(def_id, _) = *output_ty.kind() {
|
if let ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) = *output_ty.kind() {
|
||||||
output_ty = self.infcx.tcx.type_of(def_id)
|
output_ty = self.infcx.tcx.type_of(def_id)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ pub(crate) fn eval_nullary_intrinsic<'tcx>(
|
||||||
ConstValue::from_machine_usize(adt.variants().len() as u64, &tcx)
|
ConstValue::from_machine_usize(adt.variants().len() as u64, &tcx)
|
||||||
}
|
}
|
||||||
ty::Projection(_)
|
ty::Projection(_)
|
||||||
| ty::Opaque(_, _)
|
| ty::Opaque(ty::OpaqueTy { def_id: _, substs: _ })
|
||||||
| ty::Param(_)
|
| ty::Param(_)
|
||||||
| ty::Placeholder(_)
|
| ty::Placeholder(_)
|
||||||
| ty::Infer(_) => throw_inval!(TooGeneric),
|
| ty::Infer(_) => throw_inval!(TooGeneric),
|
||||||
|
|
|
@ -241,7 +241,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let kind = match parent_ty.ty.kind() {
|
let kind = match parent_ty.ty.kind() {
|
||||||
&ty::Opaque(def_id, substs) => {
|
&ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
self.tcx.bound_type_of(def_id).subst(self.tcx, substs).kind()
|
self.tcx.bound_type_of(def_id).subst(self.tcx, substs).kind()
|
||||||
}
|
}
|
||||||
kind => kind,
|
kind => kind,
|
||||||
|
|
|
@ -58,7 +58,7 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> {
|
||||||
// Types with identity (print the module path).
|
// Types with identity (print the module path).
|
||||||
ty::Adt(ty::AdtDef(Interned(&ty::AdtDefData { did: def_id, .. }, _)), substs)
|
ty::Adt(ty::AdtDef(Interned(&ty::AdtDefData { did: def_id, .. }, _)), substs)
|
||||||
| ty::FnDef(def_id, substs)
|
| ty::FnDef(def_id, substs)
|
||||||
| ty::Opaque(def_id, substs)
|
| ty::Opaque(ty::OpaqueTy { def_id, substs })
|
||||||
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
||||||
| ty::Closure(def_id, substs)
|
| ty::Closure(def_id, substs)
|
||||||
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
|
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
|
||||||
|
|
|
@ -1440,7 +1440,7 @@ fn opaque_type_cycle_error(tcx: TyCtxt<'_>, def_id: LocalDefId, span: Span) -> E
|
||||||
impl<'tcx> ty::visit::TypeVisitor<'tcx> for OpaqueTypeCollector {
|
impl<'tcx> ty::visit::TypeVisitor<'tcx> for OpaqueTypeCollector {
|
||||||
fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||||
match *t.kind() {
|
match *t.kind() {
|
||||||
ty::Opaque(def, _) => {
|
ty::Opaque(ty::OpaqueTy { def_id: def, substs: _ }) => {
|
||||||
self.0.push(def);
|
self.0.push(def);
|
||||||
ControlFlow::CONTINUE
|
ControlFlow::CONTINUE
|
||||||
}
|
}
|
||||||
|
|
|
@ -666,7 +666,7 @@ fn find_opaque_ty_constraints_for_tait(tcx: TyCtxt<'_>, def_id: LocalDefId) -> T
|
||||||
|
|
||||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||||
let scope = tcx.hir().get_defining_scope(hir_id);
|
let scope = tcx.hir().get_defining_scope(hir_id);
|
||||||
let mut locator = ConstraintLocator { def_id: def_id, tcx, found: None, typeck_types: vec![] };
|
let mut locator = ConstraintLocator { def_id, tcx, found: None, typeck_types: vec![] };
|
||||||
|
|
||||||
debug!(?scope);
|
debug!(?scope);
|
||||||
|
|
||||||
|
@ -803,7 +803,7 @@ fn find_opaque_ty_constraints_for_rpit(
|
||||||
if let Some(concrete) = concrete {
|
if let Some(concrete) = concrete {
|
||||||
let scope = tcx.hir().local_def_id_to_hir_id(owner_def_id);
|
let scope = tcx.hir().local_def_id_to_hir_id(owner_def_id);
|
||||||
debug!(?scope);
|
debug!(?scope);
|
||||||
let mut locator = ConstraintChecker { def_id: def_id, tcx, found: concrete };
|
let mut locator = ConstraintChecker { def_id, tcx, found: concrete };
|
||||||
|
|
||||||
match tcx.hir().get(scope) {
|
match tcx.hir().get(scope) {
|
||||||
Node::Item(it) => intravisit::walk_item(&mut locator, it),
|
Node::Item(it) => intravisit::walk_item(&mut locator, it),
|
||||||
|
|
|
@ -253,7 +253,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
|
||||||
self.add_constraints_from_invariant_substs(current, data.substs, variance);
|
self.add_constraints_from_invariant_substs(current, data.substs, variance);
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::Opaque(_, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id: _, substs }) => {
|
||||||
self.add_constraints_from_invariant_substs(current, substs, variance);
|
self.add_constraints_from_invariant_substs(current, substs, variance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -518,7 +518,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
let substs = sig.output().walk().find_map(|arg| {
|
let substs = sig.output().walk().find_map(|arg| {
|
||||||
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
||||||
&& let ty::Opaque(def_id, substs) = *ty.kind()
|
&& let ty::Opaque(ty::OpaqueTy { def_id, substs }) = *ty.kind()
|
||||||
&& def_id == rpit_def_id
|
&& def_id == rpit_def_id
|
||||||
{
|
{
|
||||||
Some(substs)
|
Some(substs)
|
||||||
|
|
|
@ -119,7 +119,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
ty::Foreign(..) => Some(PointerKind::Thin),
|
ty::Foreign(..) => Some(PointerKind::Thin),
|
||||||
// We should really try to normalize here.
|
// We should really try to normalize here.
|
||||||
ty::Projection(pi) => Some(PointerKind::OfProjection(pi)),
|
ty::Projection(pi) => Some(PointerKind::OfProjection(pi)),
|
||||||
ty::Opaque(def_id, substs) => Some(PointerKind::OfOpaque(def_id, substs)),
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
|
Some(PointerKind::OfOpaque(def_id, substs))
|
||||||
|
}
|
||||||
ty::Param(p) => Some(PointerKind::OfParam(p)),
|
ty::Param(p) => Some(PointerKind::OfParam(p)),
|
||||||
// Insufficient type information.
|
// Insufficient type information.
|
||||||
ty::Placeholder(..) | ty::Bound(..) | ty::Infer(_) => None,
|
ty::Placeholder(..) | ty::Bound(..) | ty::Infer(_) => None,
|
||||||
|
|
|
@ -167,7 +167,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
expected_ty: Ty<'tcx>,
|
expected_ty: Ty<'tcx>,
|
||||||
) -> (Option<ExpectedSig<'tcx>>, Option<ty::ClosureKind>) {
|
) -> (Option<ExpectedSig<'tcx>>, Option<ty::ClosureKind>) {
|
||||||
match *expected_ty.kind() {
|
match *expected_ty.kind() {
|
||||||
ty::Opaque(def_id, substs) => self.deduce_signature_from_predicates(
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => self.deduce_signature_from_predicates(
|
||||||
self.tcx.bound_explicit_item_bounds(def_id).subst_iter_copied(self.tcx, substs),
|
self.tcx.bound_explicit_item_bounds(def_id).subst_iter_copied(self.tcx, substs),
|
||||||
),
|
),
|
||||||
ty::Dynamic(ref object_type, ..) => {
|
ty::Dynamic(ref object_type, ..) => {
|
||||||
|
@ -677,7 +677,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
get_future_output(obligation.predicate, obligation.cause.span)
|
get_future_output(obligation.predicate, obligation.cause.span)
|
||||||
})?
|
})?
|
||||||
}
|
}
|
||||||
ty::Opaque(def_id, substs) => self
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => self
|
||||||
.tcx
|
.tcx
|
||||||
.bound_explicit_item_bounds(def_id)
|
.bound_explicit_item_bounds(def_id)
|
||||||
.subst_iter_copied(self.tcx, substs)
|
.subst_iter_copied(self.tcx, substs)
|
||||||
|
|
|
@ -1805,7 +1805,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
|
||||||
{
|
{
|
||||||
let ty = <dyn AstConv<'_>>::ast_ty_to_ty(fcx, ty);
|
let ty = <dyn AstConv<'_>>::ast_ty_to_ty(fcx, ty);
|
||||||
// Get the `impl Trait`'s `DefId`.
|
// Get the `impl Trait`'s `DefId`.
|
||||||
if let ty::Opaque(def_id, _) = ty.kind()
|
if let ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) = ty.kind()
|
||||||
// Get the `impl Trait`'s `Item` so that we can get its trait bounds and
|
// Get the `impl Trait`'s `Item` so that we can get its trait bounds and
|
||||||
// get the `Trait`'s `DefId`.
|
// get the `Trait`'s `DefId`.
|
||||||
&& let hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds, .. }) =
|
&& let hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds, .. }) =
|
||||||
|
|
|
@ -2391,7 +2391,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
ty::Param(param_ty) => {
|
ty::Param(param_ty) => {
|
||||||
self.point_at_param_definition(&mut err, param_ty);
|
self.point_at_param_definition(&mut err, param_ty);
|
||||||
}
|
}
|
||||||
ty::Opaque(_, _) => {
|
ty::Opaque(ty::OpaqueTy { def_id: _, substs: _ }) => {
|
||||||
self.suggest_await_on_field_access(&mut err, ident, base, base_ty.peel_refs());
|
self.suggest_await_on_field_access(&mut err, ident, base, base_ty.peel_refs());
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
|
@ -716,7 +716,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
if formal_ret.has_infer_types() {
|
if formal_ret.has_infer_types() {
|
||||||
for ty in ret_ty.walk() {
|
for ty in ret_ty.walk() {
|
||||||
if let ty::subst::GenericArgKind::Type(ty) = ty.unpack()
|
if let ty::subst::GenericArgKind::Type(ty) = ty.unpack()
|
||||||
&& let ty::Opaque(def_id, _) = *ty.kind()
|
&& let ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) = *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, DUMMY_SP).is_some() {
|
||||||
return None;
|
return None;
|
||||||
|
|
|
@ -2124,7 +2124,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::Opaque(new_def_id, _)
|
ty::Opaque(ty::OpaqueTy { def_id: new_def_id, substs: _ })
|
||||||
| ty::Closure(new_def_id, _)
|
| ty::Closure(new_def_id, _)
|
||||||
| ty::FnDef(new_def_id, _) => {
|
| ty::FnDef(new_def_id, _) => {
|
||||||
def_id = new_def_id;
|
def_id = new_def_id;
|
||||||
|
|
|
@ -174,7 +174,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let fn_sig = substs.as_closure().sig();
|
let fn_sig = substs.as_closure().sig();
|
||||||
Some((DefIdOrName::DefId(def_id), fn_sig.output(), fn_sig.inputs().map_bound(|inputs| &inputs[1..])))
|
Some((DefIdOrName::DefId(def_id), fn_sig.output(), fn_sig.inputs().map_bound(|inputs| &inputs[1..])))
|
||||||
}
|
}
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
self.tcx.bound_item_bounds(def_id).subst(self.tcx, substs).iter().find_map(|pred| {
|
self.tcx.bound_item_bounds(def_id).subst(self.tcx, substs).iter().find_map(|pred| {
|
||||||
if let ty::PredicateKind::Clause(ty::Clause::Projection(proj)) = pred.kind().skip_binder()
|
if let ty::PredicateKind::Clause(ty::Clause::Projection(proj)) = pred.kind().skip_binder()
|
||||||
&& Some(proj.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output()
|
&& Some(proj.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output()
|
||||||
|
|
|
@ -563,7 +563,7 @@ fn check_must_not_suspend_ty<'tcx>(
|
||||||
}
|
}
|
||||||
ty::Adt(def, _) => check_must_not_suspend_def(fcx.tcx, def.did(), hir_id, data),
|
ty::Adt(def, _) => check_must_not_suspend_def(fcx.tcx, def.did(), hir_id, data),
|
||||||
// FIXME: support adding the attribute to TAITs
|
// FIXME: support adding the attribute to TAITs
|
||||||
ty::Opaque(def, _) => {
|
ty::Opaque(ty::OpaqueTy { def_id: def, substs: _ }) => {
|
||||||
let mut has_emitted = false;
|
let mut has_emitted = false;
|
||||||
for &(predicate, _) in fcx.tcx.explicit_item_bounds(def) {
|
for &(predicate, _) in fcx.tcx.explicit_item_bounds(def) {
|
||||||
// We only look at the `DefId`, so it is safe to skip the binder here.
|
// We only look at the `DefId`, so it is safe to skip the binder here.
|
||||||
|
|
|
@ -546,7 +546,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
|
||||||
impl<'tcx> ty::TypeVisitor<'tcx> for RecursionChecker {
|
impl<'tcx> ty::TypeVisitor<'tcx> for RecursionChecker {
|
||||||
type BreakTy = ();
|
type BreakTy = ();
|
||||||
fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||||
if let ty::Opaque(def_id, _) = *t.kind() {
|
if let ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) = *t.kind() {
|
||||||
if def_id == self.def_id.to_def_id() {
|
if def_id == self.def_id.to_def_id() {
|
||||||
return ControlFlow::Break(());
|
return ControlFlow::Break(());
|
||||||
}
|
}
|
||||||
|
|
|
@ -675,7 +675,7 @@ impl<'tcx> TypeRelation<'tcx> for Generalizer<'_, 'tcx> {
|
||||||
// relatable.
|
// relatable.
|
||||||
Ok(t)
|
Ok(t)
|
||||||
}
|
}
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
let s = self.relate(substs, substs)?;
|
let s = self.relate(substs, substs)?;
|
||||||
Ok(if s == substs { t } else { self.infcx.tcx.mk_opaque(def_id, s) })
|
Ok(if s == substs { t } else { self.infcx.tcx.mk_opaque(def_id, s) })
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,11 +100,15 @@ impl<'tcx> TypeRelation<'tcx> for Equate<'_, '_, 'tcx> {
|
||||||
self.fields.instantiate(a, RelationDir::EqTo, b_id, self.a_is_expected)?;
|
self.fields.instantiate(a, RelationDir::EqTo, b_id, self.a_is_expected)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
(&ty::Opaque(a_def_id, _), &ty::Opaque(b_def_id, _)) if a_def_id == b_def_id => {
|
(
|
||||||
|
&ty::Opaque(ty::OpaqueTy { def_id: a_def_id, substs: _ }),
|
||||||
|
&ty::Opaque(ty::OpaqueTy { def_id: b_def_id, substs: _ }),
|
||||||
|
) if a_def_id == b_def_id => {
|
||||||
self.fields.infcx.super_combine_tys(self, a, b)?;
|
self.fields.infcx.super_combine_tys(self, a, b)?;
|
||||||
}
|
}
|
||||||
(&ty::Opaque(did, ..), _) | (_, &ty::Opaque(did, ..))
|
(&ty::Opaque(ty::OpaqueTy { def_id, substs: _ }), _)
|
||||||
if self.fields.define_opaque_types && did.is_local() =>
|
| (_, &ty::Opaque(ty::OpaqueTy { def_id, substs: _ }))
|
||||||
|
if self.fields.define_opaque_types && def_id.is_local() =>
|
||||||
{
|
{
|
||||||
self.fields.obligations.extend(
|
self.fields.obligations.extend(
|
||||||
infcx
|
infcx
|
||||||
|
|
|
@ -338,8 +338,9 @@ pub fn unexpected_hidden_region_diagnostic<'tcx>(
|
||||||
|
|
||||||
impl<'tcx> InferCtxt<'tcx> {
|
impl<'tcx> InferCtxt<'tcx> {
|
||||||
pub fn get_impl_future_output_ty(&self, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
|
pub fn get_impl_future_output_ty(&self, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
|
||||||
|
// FIXME(alias): Merge these
|
||||||
let (def_id, substs) = match *ty.kind() {
|
let (def_id, substs) = match *ty.kind() {
|
||||||
ty::Opaque(def_id, substs) => (def_id, substs),
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => (def_id, substs),
|
||||||
ty::Projection(data)
|
ty::Projection(data)
|
||||||
if self.tcx.def_kind(data.item_def_id) == DefKind::ImplTraitPlaceholder =>
|
if self.tcx.def_kind(data.item_def_id) == DefKind::ImplTraitPlaceholder =>
|
||||||
{
|
{
|
||||||
|
@ -1729,8 +1730,9 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
TypeError::Sorts(values) => {
|
TypeError::Sorts(values) => {
|
||||||
let extra = expected == found;
|
let extra = expected == found;
|
||||||
let sort_string = |ty: Ty<'tcx>, path: Option<PathBuf>| {
|
let sort_string = |ty: Ty<'tcx>, path: Option<PathBuf>| {
|
||||||
|
// FIXME(alias): Merge these
|
||||||
let mut s = match (extra, ty.kind()) {
|
let mut s = match (extra, ty.kind()) {
|
||||||
(true, ty::Opaque(def_id, _)) => {
|
(true, ty::Opaque(ty::OpaqueTy { def_id, .. })) => {
|
||||||
let sm = self.tcx.sess.source_map();
|
let sm = self.tcx.sess.source_map();
|
||||||
let pos = sm.lookup_char_pos(self.tcx.def_span(*def_id).lo());
|
let pos = sm.lookup_char_pos(self.tcx.def_span(*def_id).lo());
|
||||||
format!(
|
format!(
|
||||||
|
@ -2383,7 +2385,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
// fn get_later<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
|
// fn get_later<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
|
||||||
// suggest:
|
// suggest:
|
||||||
// fn get_later<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a
|
// fn get_later<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a
|
||||||
ty::Closure(_, _substs) | ty::Opaque(_, _substs) if return_impl_trait => {
|
ty::Closure(_, _substs)
|
||||||
|
| ty::Opaque(ty::OpaqueTy { def_id: _, substs: _substs })
|
||||||
|
if return_impl_trait =>
|
||||||
|
{
|
||||||
new_binding_suggestion(&mut err, type_param_span);
|
new_binding_suggestion(&mut err, type_param_span);
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -2765,7 +2770,7 @@ impl TyCategory {
|
||||||
pub fn from_ty(tcx: TyCtxt<'_>, ty: Ty<'_>) -> Option<(Self, DefId)> {
|
pub fn from_ty(tcx: TyCtxt<'_>, ty: Ty<'_>) -> Option<(Self, DefId)> {
|
||||||
match *ty.kind() {
|
match *ty.kind() {
|
||||||
ty::Closure(def_id, _) => Some((Self::Closure, def_id)),
|
ty::Closure(def_id, _) => Some((Self::Closure, def_id)),
|
||||||
ty::Opaque(def_id, _) => Some((Self::Opaque, def_id)),
|
ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) => Some((Self::Opaque, def_id)),
|
||||||
ty::Generator(def_id, ..) => {
|
ty::Generator(def_id, ..) => {
|
||||||
Some((Self::Generator(tcx.generator_kind(def_id).unwrap()), def_id))
|
Some((Self::Generator(tcx.generator_kind(def_id).unwrap()), def_id))
|
||||||
}
|
}
|
||||||
|
|
|
@ -486,12 +486,14 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
_ if self.same_type_modulo_infer(last_expr_ty, expected_ty) => {
|
_ if self.same_type_modulo_infer(last_expr_ty, expected_ty) => {
|
||||||
StatementAsExpression::CorrectType
|
StatementAsExpression::CorrectType
|
||||||
}
|
}
|
||||||
(ty::Opaque(last_def_id, _), ty::Opaque(exp_def_id, _))
|
(
|
||||||
if last_def_id == exp_def_id =>
|
ty::Opaque(ty::OpaqueTy { def_id: last_def_id, substs: _ }),
|
||||||
{
|
ty::Opaque(ty::OpaqueTy { def_id: exp_def_id, substs: _ }),
|
||||||
StatementAsExpression::CorrectType
|
) if last_def_id == exp_def_id => StatementAsExpression::CorrectType,
|
||||||
}
|
(
|
||||||
(ty::Opaque(last_def_id, last_bounds), ty::Opaque(exp_def_id, exp_bounds)) => {
|
ty::Opaque(ty::OpaqueTy { def_id: last_def_id, substs: last_bounds }),
|
||||||
|
ty::Opaque(ty::OpaqueTy { def_id: exp_def_id, substs: exp_bounds }),
|
||||||
|
) => {
|
||||||
debug!(
|
debug!(
|
||||||
"both opaque, likely future {:?} {:?} {:?} {:?}",
|
"both opaque, likely future {:?} {:?} {:?} {:?}",
|
||||||
last_def_id, last_bounds, exp_def_id, exp_bounds
|
last_def_id, last_bounds, exp_def_id, exp_bounds
|
||||||
|
@ -507,7 +509,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
(
|
(
|
||||||
hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds: last_bounds, .. }),
|
hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds: last_bounds, .. }),
|
||||||
hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds: exp_bounds, .. }),
|
hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds: exp_bounds, .. }),
|
||||||
) if std::iter::zip(*last_bounds, *exp_bounds).all(|(left, right)| {
|
) if iter::zip(*last_bounds, *exp_bounds).all(|(left, right)| {
|
||||||
match (left, right) {
|
match (left, right) {
|
||||||
(
|
(
|
||||||
hir::GenericBound::Trait(tl, ml),
|
hir::GenericBound::Trait(tl, ml),
|
||||||
|
|
|
@ -105,11 +105,13 @@ where
|
||||||
Ok(v)
|
Ok(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
(&ty::Opaque(a_def_id, _), &ty::Opaque(b_def_id, _)) if a_def_id == b_def_id => {
|
(
|
||||||
infcx.super_combine_tys(this, a, b)
|
&ty::Opaque(ty::OpaqueTy { def_id: a_def_id, substs: _ }),
|
||||||
}
|
&ty::Opaque(ty::OpaqueTy { def_id: b_def_id, substs: _ }),
|
||||||
(&ty::Opaque(did, ..), _) | (_, &ty::Opaque(did, ..))
|
) if a_def_id == b_def_id => infcx.super_combine_tys(this, a, b),
|
||||||
if this.define_opaque_types() && did.is_local() =>
|
(&ty::Opaque(ty::OpaqueTy { def_id, substs: _ }), _)
|
||||||
|
| (_, &ty::Opaque(ty::OpaqueTy { def_id, substs: _ }))
|
||||||
|
if this.define_opaque_types() && def_id.is_local() =>
|
||||||
{
|
{
|
||||||
this.add_obligations(
|
this.add_obligations(
|
||||||
infcx
|
infcx
|
||||||
|
|
|
@ -608,16 +608,20 @@ where
|
||||||
|
|
||||||
(&ty::Infer(ty::TyVar(vid)), _) => self.relate_ty_var((vid, b)),
|
(&ty::Infer(ty::TyVar(vid)), _) => self.relate_ty_var((vid, b)),
|
||||||
|
|
||||||
(&ty::Opaque(a_def_id, _), &ty::Opaque(b_def_id, _)) if a_def_id == b_def_id => {
|
(
|
||||||
infcx.super_combine_tys(self, a, b).or_else(|err| {
|
&ty::Opaque(ty::OpaqueTy { def_id: a_def_id, substs: _ }),
|
||||||
self.tcx().sess.delay_span_bug(
|
&ty::Opaque(ty::OpaqueTy { def_id: b_def_id, substs: _ }),
|
||||||
self.delegate.span(),
|
) if a_def_id == b_def_id => infcx.super_combine_tys(self, a, b).or_else(|err| {
|
||||||
"failure to relate an opaque to itself should result in an error later on",
|
self.tcx().sess.delay_span_bug(
|
||||||
);
|
self.delegate.span(),
|
||||||
if a_def_id.is_local() { self.relate_opaques(a, b) } else { Err(err) }
|
"failure to relate an opaque to itself should result in an error later on",
|
||||||
})
|
);
|
||||||
}
|
if a_def_id.is_local() { self.relate_opaques(a, b) } else { Err(err) }
|
||||||
(&ty::Opaque(did, ..), _) | (_, &ty::Opaque(did, ..)) if did.is_local() => {
|
}),
|
||||||
|
(&ty::Opaque(ty::OpaqueTy { def_id, substs: _ }), _)
|
||||||
|
| (_, &ty::Opaque(ty::OpaqueTy { def_id, substs: _ }))
|
||||||
|
if def_id.is_local() =>
|
||||||
|
{
|
||||||
self.relate_opaques(a, b)
|
self.relate_opaques(a, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,9 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
lt_op: |lt| lt,
|
lt_op: |lt| lt,
|
||||||
ct_op: |ct| ct,
|
ct_op: |ct| ct,
|
||||||
ty_op: |ty| match *ty.kind() {
|
ty_op: |ty| match *ty.kind() {
|
||||||
ty::Opaque(def_id, _substs) if replace_opaque_type(def_id) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs: _substs })
|
||||||
|
if replace_opaque_type(def_id) =>
|
||||||
|
{
|
||||||
let def_span = self.tcx.def_span(def_id);
|
let def_span = self.tcx.def_span(def_id);
|
||||||
let span = if span.contains(def_span) { def_span } else { span };
|
let span = if span.contains(def_span) { def_span } else { span };
|
||||||
let code = traits::ObligationCauseCode::OpaqueReturnType(None);
|
let code = traits::ObligationCauseCode::OpaqueReturnType(None);
|
||||||
|
@ -104,7 +106,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
}
|
}
|
||||||
let (a, b) = if a_is_expected { (a, b) } else { (b, a) };
|
let (a, b) = if a_is_expected { (a, b) } else { (b, a) };
|
||||||
let process = |a: Ty<'tcx>, b: Ty<'tcx>, a_is_expected| match *a.kind() {
|
let process = |a: Ty<'tcx>, b: Ty<'tcx>, a_is_expected| match *a.kind() {
|
||||||
ty::Opaque(def_id, substs) if def_id.is_local() => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) if def_id.is_local() => {
|
||||||
let def_id = def_id.expect_local();
|
let def_id = def_id.expect_local();
|
||||||
let origin = match self.defining_use_anchor {
|
let origin = match self.defining_use_anchor {
|
||||||
DefiningAnchor::Bind(_) => {
|
DefiningAnchor::Bind(_) => {
|
||||||
|
@ -147,18 +149,19 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
DefiningAnchor::Bubble => self.opaque_ty_origin_unchecked(def_id, cause.span),
|
DefiningAnchor::Bubble => self.opaque_ty_origin_unchecked(def_id, cause.span),
|
||||||
DefiningAnchor::Error => return None,
|
DefiningAnchor::Error => return None,
|
||||||
};
|
};
|
||||||
if let ty::Opaque(did2, _) = *b.kind() {
|
if let ty::Opaque(ty::OpaqueTy { def_id: b_def_id, substs: _ }) = *b.kind() {
|
||||||
// We could accept this, but there are various ways to handle this situation, and we don't
|
// We could accept this, but there are various ways to handle this situation, and we don't
|
||||||
// want to make a decision on it right now. Likely this case is so super rare anyway, that
|
// want to make a decision on it right now. Likely this case is so super rare anyway, that
|
||||||
// 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) =
|
if let Some(OpaqueTyOrigin::TyAlias) = b_def_id
|
||||||
did2.as_local().and_then(|did2| self.opaque_type_origin(did2, cause.span))
|
.as_local()
|
||||||
|
.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,
|
||||||
hidden_type: self.tcx.def_span(did2),
|
hidden_type: self.tcx.def_span(b_def_id),
|
||||||
opaque_type: self.tcx.def_span(def_id),
|
opaque_type: self.tcx.def_span(def_id),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -475,7 +478,7 @@ where
|
||||||
substs.as_generator().resume_ty().visit_with(self);
|
substs.as_generator().resume_ty().visit_with(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::Opaque(def_id, ref substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, ref substs }) => {
|
||||||
// Skip lifetime paramters that are not captures.
|
// Skip lifetime paramters that are not captures.
|
||||||
let variances = self.tcx.variances_of(*def_id);
|
let variances = self.tcx.variances_of(*def_id);
|
||||||
|
|
||||||
|
@ -578,7 +581,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
}
|
}
|
||||||
// Replace all other mentions of the same opaque type with the hidden type,
|
// Replace all other mentions of the same opaque type with the hidden type,
|
||||||
// as the bounds must hold on the hidden type after all.
|
// as the bounds must hold on the hidden type after all.
|
||||||
ty::Opaque(def_id2, substs2)
|
ty::Opaque(ty::OpaqueTy { def_id: def_id2, substs: substs2 })
|
||||||
if def_id.to_def_id() == def_id2 && substs == substs2 =>
|
if def_id.to_def_id() == def_id2 && substs == substs2 =>
|
||||||
{
|
{
|
||||||
hidden_ty
|
hidden_ty
|
||||||
|
|
|
@ -130,7 +130,7 @@ fn compute_components<'tcx>(
|
||||||
// outlives any other lifetime, which is unsound.
|
// outlives any other lifetime, which is unsound.
|
||||||
// See https://github.com/rust-lang/rust/issues/84305 for
|
// See https://github.com/rust-lang/rust/issues/84305 for
|
||||||
// more details.
|
// more details.
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
out.push(Component::Opaque(def_id, substs));
|
out.push(Component::Opaque(def_id, substs));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -338,7 +338,7 @@ where
|
||||||
substs,
|
substs,
|
||||||
true,
|
true,
|
||||||
|ty| match *ty.kind() {
|
|ty| match *ty.kind() {
|
||||||
ty::Opaque(def_id, substs) => (def_id, substs),
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => (def_id, substs),
|
||||||
_ => bug!("expected only projection types from env, not {:?}", ty),
|
_ => bug!("expected only projection types from env, not {:?}", ty),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -130,12 +130,16 @@ impl<'tcx> TypeRelation<'tcx> for Sub<'_, '_, 'tcx> {
|
||||||
Ok(self.tcx().ty_error_with_guaranteed(e))
|
Ok(self.tcx().ty_error_with_guaranteed(e))
|
||||||
}
|
}
|
||||||
|
|
||||||
(&ty::Opaque(a_def_id, _), &ty::Opaque(b_def_id, _)) if a_def_id == b_def_id => {
|
(
|
||||||
|
&ty::Opaque(ty::OpaqueTy { def_id: a_def_id, substs: _ }),
|
||||||
|
&ty::Opaque(ty::OpaqueTy { def_id: b_def_id, substs: _ }),
|
||||||
|
) if a_def_id == b_def_id => {
|
||||||
self.fields.infcx.super_combine_tys(self, a, b)?;
|
self.fields.infcx.super_combine_tys(self, a, b)?;
|
||||||
Ok(a)
|
Ok(a)
|
||||||
}
|
}
|
||||||
(&ty::Opaque(did, ..), _) | (_, &ty::Opaque(did, ..))
|
(&ty::Opaque(ty::OpaqueTy { def_id, substs: _ }), _)
|
||||||
if self.fields.define_opaque_types && did.is_local() =>
|
| (_, &ty::Opaque(ty::OpaqueTy { def_id, substs: _ }))
|
||||||
|
if self.fields.define_opaque_types && def_id.is_local() =>
|
||||||
{
|
{
|
||||||
self.fields.obligations.extend(
|
self.fields.obligations.extend(
|
||||||
infcx
|
infcx
|
||||||
|
|
|
@ -117,7 +117,7 @@ impl<'tcx> LateLintPass<'tcx> for OpaqueHiddenInferredBound {
|
||||||
// then we can emit a suggestion to add the bound.
|
// then we can emit a suggestion to add the bound.
|
||||||
let add_bound = match (proj_term.kind(), assoc_pred.kind().skip_binder()) {
|
let add_bound = match (proj_term.kind(), assoc_pred.kind().skip_binder()) {
|
||||||
(
|
(
|
||||||
ty::Opaque(def_id, _),
|
ty::Opaque(ty::OpaqueTy { def_id, substs: _ }),
|
||||||
ty::PredicateKind::Clause(ty::Clause::Trait(trait_pred)),
|
ty::PredicateKind::Clause(ty::Clause::Trait(trait_pred)),
|
||||||
) => Some(AddBound {
|
) => Some(AddBound {
|
||||||
suggest_span: cx.tcx.def_span(*def_id).shrink_to_hi(),
|
suggest_span: cx.tcx.def_span(*def_id).shrink_to_hi(),
|
||||||
|
|
|
@ -96,7 +96,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
|
||||||
|
|
||||||
if let hir::ExprKind::Match(await_expr, _arms, hir::MatchSource::AwaitDesugar) = expr.kind
|
if let hir::ExprKind::Match(await_expr, _arms, hir::MatchSource::AwaitDesugar) = expr.kind
|
||||||
&& let ty = cx.typeck_results().expr_ty(&await_expr)
|
&& let ty = cx.typeck_results().expr_ty(&await_expr)
|
||||||
&& let ty::Opaque(future_def_id, _) = ty.kind()
|
&& let ty::Opaque(ty::OpaqueTy { def_id: future_def_id, substs: _ }) = ty.kind()
|
||||||
&& cx.tcx.ty_is_opaque_future(ty)
|
&& cx.tcx.ty_is_opaque_future(ty)
|
||||||
// FIXME: This also includes non-async fns that return `impl Future`.
|
// FIXME: This also includes non-async fns that return `impl Future`.
|
||||||
&& let async_fn_def_id = cx.tcx.parent(*future_def_id)
|
&& let async_fn_def_id = cx.tcx.parent(*future_def_id)
|
||||||
|
@ -251,7 +251,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
|
||||||
.map(|inner| MustUsePath::Boxed(Box::new(inner)))
|
.map(|inner| MustUsePath::Boxed(Box::new(inner)))
|
||||||
}
|
}
|
||||||
ty::Adt(def, _) => is_def_must_use(cx, def.did(), span),
|
ty::Adt(def, _) => is_def_must_use(cx, def.did(), span),
|
||||||
ty::Opaque(def, _) => {
|
ty::Opaque(ty::OpaqueTy { def_id: def, substs: _ }) => {
|
||||||
elaborate_predicates_with_span(
|
elaborate_predicates_with_span(
|
||||||
cx.tcx,
|
cx.tcx,
|
||||||
cx.tcx.explicit_item_bounds(def).iter().cloned(),
|
cx.tcx.explicit_item_bounds(def).iter().cloned(),
|
||||||
|
|
|
@ -117,6 +117,7 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
|
||||||
type BinderListTy = Binder<'tcx, &'tcx List<Ty<'tcx>>>;
|
type BinderListTy = Binder<'tcx, &'tcx List<Ty<'tcx>>>;
|
||||||
type ListTy = &'tcx List<Ty<'tcx>>;
|
type ListTy = &'tcx List<Ty<'tcx>>;
|
||||||
type ProjectionTy = ty::ProjectionTy<'tcx>;
|
type ProjectionTy = ty::ProjectionTy<'tcx>;
|
||||||
|
type OpaqueTy = ty::OpaqueTy<'tcx>;
|
||||||
type ParamTy = ParamTy;
|
type ParamTy = ParamTy;
|
||||||
type BoundTy = ty::BoundTy;
|
type BoundTy = ty::BoundTy;
|
||||||
type PlaceholderType = ty::PlaceholderType;
|
type PlaceholderType = ty::PlaceholderType;
|
||||||
|
@ -2323,7 +2324,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
|
|
||||||
/// Given a `ty`, return whether it's an `impl Future<...>`.
|
/// Given a `ty`, return whether it's an `impl Future<...>`.
|
||||||
pub fn ty_is_opaque_future(self, ty: Ty<'_>) -> bool {
|
pub fn ty_is_opaque_future(self, ty: Ty<'_>) -> bool {
|
||||||
let ty::Opaque(def_id, _) = ty.kind() else { return false };
|
let ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) = ty.kind() else { return false };
|
||||||
let future_trait = self.require_lang_item(LangItem::Future, None);
|
let future_trait = self.require_lang_item(LangItem::Future, None);
|
||||||
|
|
||||||
self.explicit_item_bounds(def_id).iter().any(|(predicate, _)| {
|
self.explicit_item_bounds(def_id).iter().any(|(predicate, _)| {
|
||||||
|
@ -2668,7 +2669,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn mk_opaque(self, def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
|
pub fn mk_opaque(self, def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
|
||||||
self.mk_ty(Opaque(def_id, substs))
|
self.mk_ty(Opaque(ty::OpaqueTy { def_id, substs }))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mk_place_field(self, place: Place<'tcx>, f: Field, ty: Ty<'tcx>) -> Place<'tcx> {
|
pub fn mk_place_field(self, place: Place<'tcx>, f: Field, ty: Ty<'tcx>) -> Place<'tcx> {
|
||||||
|
|
|
@ -4,7 +4,7 @@ use std::ops::ControlFlow;
|
||||||
|
|
||||||
use crate::ty::{
|
use crate::ty::{
|
||||||
visit::TypeVisitable, Const, ConstKind, DefIdTree, ExistentialPredicate, InferConst, InferTy,
|
visit::TypeVisitable, Const, ConstKind, DefIdTree, ExistentialPredicate, InferConst, InferTy,
|
||||||
PolyTraitPredicate, Ty, TyCtxt, TypeSuperVisitable, TypeVisitor,
|
OpaqueTy, PolyTraitPredicate, Ty, TyCtxt, TypeSuperVisitable, TypeVisitor,
|
||||||
};
|
};
|
||||||
|
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
|
@ -457,11 +457,11 @@ impl<'tcx> TypeVisitor<'tcx> for IsSuggestableVisitor<'tcx> {
|
||||||
return ControlFlow::Break(());
|
return ControlFlow::Break(());
|
||||||
}
|
}
|
||||||
|
|
||||||
Opaque(did, _) => {
|
Opaque(OpaqueTy { def_id, substs: _ }) => {
|
||||||
let parent = self.tcx.parent(*did);
|
let parent = self.tcx.parent(*def_id);
|
||||||
if let hir::def::DefKind::TyAlias | hir::def::DefKind::AssocTy = self.tcx.def_kind(parent)
|
if let hir::def::DefKind::TyAlias | hir::def::DefKind::AssocTy = self.tcx.def_kind(parent)
|
||||||
&& let Opaque(parent_did, _) = self.tcx.type_of(parent).kind()
|
&& let Opaque(OpaqueTy { def_id: parent_opaque_def_id, substs: _ }) = self.tcx.type_of(parent).kind()
|
||||||
&& parent_did == did
|
&& parent_opaque_def_id == def_id
|
||||||
{
|
{
|
||||||
// Okay
|
// Okay
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -779,7 +779,7 @@ fn foo(&self) -> Self::T { String::new() }
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let assoc = self.associated_item(proj_ty.item_def_id);
|
let assoc = self.associated_item(proj_ty.item_def_id);
|
||||||
if let ty::Opaque(def_id, _) = *proj_ty.self_ty().kind() {
|
if let ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) = *proj_ty.self_ty().kind() {
|
||||||
let opaque_local_def_id = def_id.as_local();
|
let opaque_local_def_id = def_id.as_local();
|
||||||
let opaque_hir_ty = if let Some(opaque_local_def_id) = opaque_local_def_id {
|
let opaque_hir_ty = if let Some(opaque_local_def_id) = opaque_local_def_id {
|
||||||
match &self.hir().expect_item(opaque_local_def_id).kind {
|
match &self.hir().expect_item(opaque_local_def_id).kind {
|
||||||
|
|
|
@ -160,7 +160,7 @@ impl FlagComputation {
|
||||||
self.add_projection_ty(data);
|
self.add_projection_ty(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
&ty::Opaque(_, substs) => {
|
&ty::Opaque(ty::OpaqueTy { def_id: _, substs }) => {
|
||||||
self.add_flags(TypeFlags::HAS_TY_OPAQUE);
|
self.add_flags(TypeFlags::HAS_TY_OPAQUE);
|
||||||
self.add_substs(substs);
|
self.add_substs(substs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -728,7 +728,7 @@ pub trait PrettyPrinter<'tcx>:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::Placeholder(placeholder) => p!(write("Placeholder({:?})", placeholder)),
|
ty::Placeholder(placeholder) => p!(write("Placeholder({:?})", placeholder)),
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
// FIXME(eddyb) print this with `print_def_path`.
|
// FIXME(eddyb) print this with `print_def_path`.
|
||||||
// We use verbose printing in 'NO_QUERIES' mode, to
|
// We use verbose printing in 'NO_QUERIES' mode, to
|
||||||
// avoid needing to call `predicates_of`. This should
|
// avoid needing to call `predicates_of`. This should
|
||||||
|
@ -743,7 +743,9 @@ pub trait PrettyPrinter<'tcx>:
|
||||||
let parent = self.tcx().parent(def_id);
|
let parent = self.tcx().parent(def_id);
|
||||||
match self.tcx().def_kind(parent) {
|
match self.tcx().def_kind(parent) {
|
||||||
DefKind::TyAlias | DefKind::AssocTy => {
|
DefKind::TyAlias | DefKind::AssocTy => {
|
||||||
if let ty::Opaque(d, _) = *self.tcx().type_of(parent).kind() {
|
if let ty::Opaque(ty::OpaqueTy { def_id: d, substs: _ }) =
|
||||||
|
*self.tcx().type_of(parent).kind()
|
||||||
|
{
|
||||||
if d == def_id {
|
if d == def_id {
|
||||||
// If the type alias directly starts with the `impl` of the
|
// If the type alias directly starts with the `impl` of the
|
||||||
// opaque type we're printing, then skip the `::{opaque#1}`.
|
// opaque type we're printing, then skip the `::{opaque#1}`.
|
||||||
|
|
|
@ -564,9 +564,10 @@ pub fn super_relate_tys<'tcx, R: TypeRelation<'tcx>>(
|
||||||
Ok(tcx.mk_projection(projection_ty.item_def_id, projection_ty.substs))
|
Ok(tcx.mk_projection(projection_ty.item_def_id, projection_ty.substs))
|
||||||
}
|
}
|
||||||
|
|
||||||
(&ty::Opaque(a_def_id, a_substs), &ty::Opaque(b_def_id, b_substs))
|
(
|
||||||
if a_def_id == b_def_id =>
|
&ty::Opaque(ty::OpaqueTy { def_id: a_def_id, substs: a_substs }),
|
||||||
{
|
&ty::Opaque(ty::OpaqueTy { def_id: b_def_id, substs: b_substs }),
|
||||||
|
) if a_def_id == b_def_id => {
|
||||||
if relation.intercrate() {
|
if relation.intercrate() {
|
||||||
// During coherence, opaque types should be treated as equal to each other, even if their generic params
|
// During coherence, opaque types should be treated as equal to each other, even if their generic params
|
||||||
// differ, as they could resolve to the same hidden type, even for different generic params.
|
// differ, as they could resolve to the same hidden type, even for different generic params.
|
||||||
|
|
|
@ -652,7 +652,9 @@ impl<'tcx> TypeSuperFoldable<'tcx> for Ty<'tcx> {
|
||||||
ty::GeneratorWitness(types) => ty::GeneratorWitness(types.try_fold_with(folder)?),
|
ty::GeneratorWitness(types) => ty::GeneratorWitness(types.try_fold_with(folder)?),
|
||||||
ty::Closure(did, substs) => ty::Closure(did, substs.try_fold_with(folder)?),
|
ty::Closure(did, substs) => ty::Closure(did, substs.try_fold_with(folder)?),
|
||||||
ty::Projection(data) => ty::Projection(data.try_fold_with(folder)?),
|
ty::Projection(data) => ty::Projection(data.try_fold_with(folder)?),
|
||||||
ty::Opaque(did, substs) => ty::Opaque(did, substs.try_fold_with(folder)?),
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
|
ty::Opaque(ty::OpaqueTy { def_id, substs: substs.try_fold_with(folder)? })
|
||||||
|
}
|
||||||
|
|
||||||
ty::Bool
|
ty::Bool
|
||||||
| ty::Char
|
| ty::Char
|
||||||
|
@ -698,7 +700,7 @@ impl<'tcx> TypeSuperVisitable<'tcx> for Ty<'tcx> {
|
||||||
ty::GeneratorWitness(ref types) => types.visit_with(visitor),
|
ty::GeneratorWitness(ref types) => types.visit_with(visitor),
|
||||||
ty::Closure(_did, ref substs) => substs.visit_with(visitor),
|
ty::Closure(_did, ref substs) => substs.visit_with(visitor),
|
||||||
ty::Projection(ref data) => data.visit_with(visitor),
|
ty::Projection(ref data) => data.visit_with(visitor),
|
||||||
ty::Opaque(_, ref substs) => substs.visit_with(visitor),
|
ty::Opaque(ty::OpaqueTy { def_id: _, ref substs }) => substs.visit_with(visitor),
|
||||||
|
|
||||||
ty::Bool
|
ty::Bool
|
||||||
| ty::Char
|
| ty::Char
|
||||||
|
|
|
@ -826,7 +826,7 @@ impl<'tcx> TypeFolder<'tcx> for OpaqueTypeExpander<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
||||||
if let ty::Opaque(def_id, substs) = *t.kind() {
|
if let ty::Opaque(ty::OpaqueTy { def_id, substs }) = *t.kind() {
|
||||||
self.expand_opaque_ty(def_id, substs).unwrap_or(t)
|
self.expand_opaque_ty(def_id, substs).unwrap_or(t)
|
||||||
} else if t.has_opaque_types() {
|
} else if t.has_opaque_types() {
|
||||||
t.super_fold_with(self)
|
t.super_fold_with(self)
|
||||||
|
|
|
@ -188,7 +188,7 @@ fn push_inner<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent: GenericArg<'tcx>)
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
ty::Adt(_, substs)
|
ty::Adt(_, substs)
|
||||||
| ty::Opaque(_, substs)
|
| ty::Opaque(ty::OpaqueTy { def_id: _, substs })
|
||||||
| ty::Closure(_, substs)
|
| ty::Closure(_, substs)
|
||||||
| ty::Generator(_, substs, _)
|
| ty::Generator(_, substs, _)
|
||||||
| ty::FnDef(_, substs) => {
|
| ty::FnDef(_, substs) => {
|
||||||
|
|
|
@ -849,7 +849,7 @@ impl<'tcx> Visitor<'tcx> for CostChecker<'_, 'tcx> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let kind = match parent_ty.ty.kind() {
|
let kind = match parent_ty.ty.kind() {
|
||||||
&ty::Opaque(def_id, substs) => {
|
&ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
self.tcx.bound_type_of(def_id).subst(self.tcx, substs).kind()
|
self.tcx.bound_type_of(def_id).subst(self.tcx, substs).kind()
|
||||||
}
|
}
|
||||||
kind => kind,
|
kind => kind,
|
||||||
|
|
|
@ -241,7 +241,7 @@ where
|
||||||
self.def_id_visitor.visit_def_id(def_id, "trait", &trait_ref)?;
|
self.def_id_visitor.visit_def_id(def_id, "trait", &trait_ref)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::Opaque(def_id, ..) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) => {
|
||||||
// Skip repeated `Opaque`s to avoid infinite recursion.
|
// Skip repeated `Opaque`s to avoid infinite recursion.
|
||||||
if self.visited_opaque_tys.insert(def_id) {
|
if self.visited_opaque_tys.insert(def_id) {
|
||||||
// The intent is to treat `impl Trait1 + Trait2` identically to
|
// The intent is to treat `impl Trait1 + Trait2` identically to
|
||||||
|
|
|
@ -216,7 +216,7 @@ impl<'tcx> Printer<'tcx> for &mut SymbolPrinter<'tcx> {
|
||||||
match *ty.kind() {
|
match *ty.kind() {
|
||||||
// Print all nominal types as paths (unlike `pretty_print_type`).
|
// Print all nominal types as paths (unlike `pretty_print_type`).
|
||||||
ty::FnDef(def_id, substs)
|
ty::FnDef(def_id, substs)
|
||||||
| ty::Opaque(def_id, substs)
|
| ty::Opaque(ty::OpaqueTy { def_id, substs })
|
||||||
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
||||||
| ty::Closure(def_id, substs)
|
| ty::Closure(def_id, substs)
|
||||||
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
|
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
|
||||||
|
|
|
@ -439,7 +439,7 @@ impl<'tcx> Printer<'tcx> for &mut SymbolMangler<'tcx> {
|
||||||
// Mangle all nominal types as paths.
|
// Mangle all nominal types as paths.
|
||||||
ty::Adt(ty::AdtDef(Interned(&ty::AdtDefData { did: def_id, .. }, _)), substs)
|
ty::Adt(ty::AdtDef(Interned(&ty::AdtDefData { did: def_id, .. }, _)), substs)
|
||||||
| ty::FnDef(def_id, substs)
|
| ty::FnDef(def_id, substs)
|
||||||
| ty::Opaque(def_id, substs)
|
| ty::Opaque(ty::OpaqueTy { def_id, substs })
|
||||||
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
||||||
| ty::Closure(def_id, substs)
|
| ty::Closure(def_id, substs)
|
||||||
| ty::Generator(def_id, substs, _) => {
|
| ty::Generator(def_id, substs, _) => {
|
||||||
|
|
|
@ -855,7 +855,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
fn_sig.inputs().map_bound(|inputs| &inputs[1..]),
|
fn_sig.inputs().map_bound(|inputs| &inputs[1..]),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
self.tcx.bound_item_bounds(def_id).subst(self.tcx, substs).iter().find_map(|pred| {
|
self.tcx.bound_item_bounds(def_id).subst(self.tcx, substs).iter().find_map(|pred| {
|
||||||
if let ty::PredicateKind::Clause(ty::Clause::Projection(proj)) = pred.kind().skip_binder()
|
if let ty::PredicateKind::Clause(ty::Clause::Projection(proj)) = pred.kind().skip_binder()
|
||||||
&& Some(proj.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output()
|
&& Some(proj.projection_ty.item_def_id) == self.tcx.lang_items().fn_once_output()
|
||||||
|
@ -2644,7 +2644,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
Some(ident) => err.span_note(ident.span, &msg),
|
Some(ident) => err.span_note(ident.span, &msg),
|
||||||
None => err.note(&msg),
|
None => err.note(&msg),
|
||||||
},
|
},
|
||||||
ty::Opaque(def_id, _) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) => {
|
||||||
// Avoid printing the future from `core::future::identity_future`, it's not helpful
|
// Avoid printing the future from `core::future::identity_future`, it's not helpful
|
||||||
if tcx.parent(*def_id) == identity_future {
|
if tcx.parent(*def_id) == identity_future {
|
||||||
break 'print;
|
break 'print;
|
||||||
|
|
|
@ -496,7 +496,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> {
|
||||||
// This is really important. While we *can* handle this, this has
|
// This is really important. While we *can* handle this, this has
|
||||||
// severe performance implications for large opaque types with
|
// severe performance implications for large opaque types with
|
||||||
// late-bound regions. See `issue-88862` benchmark.
|
// late-bound regions. See `issue-88862` benchmark.
|
||||||
ty::Opaque(def_id, substs) if !substs.has_escaping_bound_vars() => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) if !substs.has_escaping_bound_vars() => {
|
||||||
// Only normalize `impl Trait` outside of type inference, usually in codegen.
|
// Only normalize `impl Trait` outside of type inference, usually in codegen.
|
||||||
match self.param_env.reveal() {
|
match self.param_env.reveal() {
|
||||||
Reveal::UserFacing => ty.super_fold_with(self),
|
Reveal::UserFacing => ty.super_fold_with(self),
|
||||||
|
@ -1378,7 +1378,9 @@ fn assemble_candidates_from_trait_def<'cx, 'tcx>(
|
||||||
// If so, extract what we know from the trait and try to come up with a good answer.
|
// If so, extract what we know from the trait and try to come up with a good answer.
|
||||||
let bounds = match *obligation.predicate.self_ty().kind() {
|
let bounds = match *obligation.predicate.self_ty().kind() {
|
||||||
ty::Projection(ref data) => tcx.bound_item_bounds(data.item_def_id).subst(tcx, data.substs),
|
ty::Projection(ref data) => tcx.bound_item_bounds(data.item_def_id).subst(tcx, data.substs),
|
||||||
ty::Opaque(def_id, substs) => tcx.bound_item_bounds(def_id).subst(tcx, substs),
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
|
tcx.bound_item_bounds(def_id).subst(tcx, substs)
|
||||||
|
}
|
||||||
ty::Infer(ty::TyVar(_)) => {
|
ty::Infer(ty::TyVar(_)) => {
|
||||||
// If the self-type is an inference variable, then it MAY wind up
|
// If the self-type is an inference variable, then it MAY wind up
|
||||||
// being a projected type, so induce an ambiguity.
|
// being a projected type, so induce an ambiguity.
|
||||||
|
|
|
@ -205,7 +205,7 @@ impl<'cx, 'tcx> FallibleTypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> {
|
||||||
// This is really important. While we *can* handle this, this has
|
// This is really important. While we *can* handle this, this has
|
||||||
// severe performance implications for large opaque types with
|
// severe performance implications for large opaque types with
|
||||||
// late-bound regions. See `issue-88862` benchmark.
|
// late-bound regions. See `issue-88862` benchmark.
|
||||||
ty::Opaque(def_id, substs) if !substs.has_escaping_bound_vars() => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) if !substs.has_escaping_bound_vars() => {
|
||||||
// Only normalize `impl Trait` outside of type inference, usually in codegen.
|
// Only normalize `impl Trait` outside of type inference, usually in codegen.
|
||||||
match self.param_env.reveal() {
|
match self.param_env.reveal() {
|
||||||
Reveal::UserFacing => ty.try_super_fold_with(self),
|
Reveal::UserFacing => ty.try_super_fold_with(self),
|
||||||
|
|
|
@ -830,7 +830,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
| ty::GeneratorWitness(_)
|
| ty::GeneratorWitness(_)
|
||||||
| ty::Never
|
| ty::Never
|
||||||
| ty::Projection(_)
|
| ty::Projection(_)
|
||||||
| ty::Opaque(_, _)
|
| ty::Opaque(ty::OpaqueTy { def_id: _, substs: _ })
|
||||||
| ty::Param(_)
|
| ty::Param(_)
|
||||||
| ty::Bound(_, _)
|
| ty::Bound(_, _)
|
||||||
| ty::Error(_)
|
| ty::Error(_)
|
||||||
|
|
|
@ -156,7 +156,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
let placeholder_trait_predicate = ty::Binder::dummy(placeholder_trait_predicate);
|
let placeholder_trait_predicate = ty::Binder::dummy(placeholder_trait_predicate);
|
||||||
let (def_id, substs) = match *placeholder_self_ty.kind() {
|
let (def_id, substs) = match *placeholder_self_ty.kind() {
|
||||||
ty::Projection(proj) => (proj.item_def_id, proj.substs),
|
ty::Projection(proj) => (proj.item_def_id, proj.substs),
|
||||||
ty::Opaque(def_id, substs) => (def_id, substs),
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => (def_id, substs),
|
||||||
_ => bug!("projection candidate for unexpected type: {:?}", placeholder_self_ty),
|
_ => bug!("projection candidate for unexpected type: {:?}", placeholder_self_ty),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1596,7 +1596,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
let tcx = self.infcx.tcx;
|
let tcx = self.infcx.tcx;
|
||||||
let (def_id, substs) = match *placeholder_trait_predicate.trait_ref.self_ty().kind() {
|
let (def_id, substs) = match *placeholder_trait_predicate.trait_ref.self_ty().kind() {
|
||||||
ty::Projection(ref data) => (data.item_def_id, data.substs),
|
ty::Projection(ref data) => (data.item_def_id, data.substs),
|
||||||
ty::Opaque(def_id, substs) => (def_id, substs),
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => (def_id, substs),
|
||||||
_ => {
|
_ => {
|
||||||
span_bug!(
|
span_bug!(
|
||||||
obligation.cause.span,
|
obligation.cause.span,
|
||||||
|
@ -2260,7 +2260,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
t.rebind(def.all_fields().map(|f| f.ty(self.tcx(), substs)).collect())
|
t.rebind(def.all_fields().map(|f| f.ty(self.tcx(), substs)).collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
// We can resolve the `impl Trait` to its concrete type,
|
// We can resolve the `impl Trait` to its concrete type,
|
||||||
// which enforces a DAG between the functions requiring
|
// which enforces a DAG between the functions requiring
|
||||||
// the auto trait bounds in question.
|
// the auto trait bounds in question.
|
||||||
|
|
|
@ -648,12 +648,12 @@ impl<'tcx> WfPredicates<'tcx> {
|
||||||
// types appearing in the fn signature
|
// types appearing in the fn signature
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::Opaque(did, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
// All of the requirements on type parameters
|
// All of the requirements on type parameters
|
||||||
// have already been checked for `impl Trait` in
|
// have already been checked for `impl Trait` in
|
||||||
// return position. We do need to check type-alias-impl-trait though.
|
// return position. We do need to check type-alias-impl-trait though.
|
||||||
if ty::is_impl_trait_defn(self.tcx, did).is_none() {
|
if ty::is_impl_trait_defn(self.tcx, def_id).is_none() {
|
||||||
let obligations = self.nominal_obligations(did, substs);
|
let obligations = self.nominal_obligations(def_id, substs);
|
||||||
self.out.extend(obligations);
|
self.out.extend(obligations);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -432,7 +432,9 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
|
||||||
(ast::Mutability::Not, chalk_ir::Mutability::Not) => true,
|
(ast::Mutability::Not, chalk_ir::Mutability::Not) => true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(&ty::Opaque(def_id, ..), OpaqueType(opaque_ty_id, ..)) => def_id == opaque_ty_id.0,
|
(&ty::Opaque(ty::OpaqueTy { def_id, substs: _ }), OpaqueType(opaque_ty_id, ..)) => {
|
||||||
|
def_id == opaque_ty_id.0
|
||||||
|
}
|
||||||
(&ty::FnDef(def_id, ..), FnDef(fn_def_id, ..)) => def_id == fn_def_id.0,
|
(&ty::FnDef(def_id, ..), FnDef(fn_def_id, ..)) => def_id == fn_def_id.0,
|
||||||
(&ty::Str, Str) => true,
|
(&ty::Str, Str) => true,
|
||||||
(&ty::Never, Never) => true,
|
(&ty::Never, Never) => true,
|
||||||
|
@ -786,7 +788,7 @@ impl<'tcx> ty::TypeFolder<'tcx> for ReplaceOpaqueTyFolder<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||||
if let ty::Opaque(def_id, substs) = *ty.kind() {
|
if let ty::Opaque(ty::OpaqueTy { def_id, substs }) = *ty.kind() {
|
||||||
if def_id == self.opaque_ty_id.0 && substs == self.identity_substs {
|
if def_id == self.opaque_ty_id.0 && substs == self.identity_substs {
|
||||||
return self.tcx.mk_ty(ty::Bound(
|
return self.tcx.mk_ty(ty::Bound(
|
||||||
self.binder_index,
|
self.binder_index,
|
||||||
|
|
|
@ -354,7 +354,7 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::Ty<RustInterner<'tcx>>> for Ty<'tcx> {
|
||||||
chalk_ir::TyKind::Tuple(types.len(), types.as_substs().lower_into(interner))
|
chalk_ir::TyKind::Tuple(types.len(), types.as_substs().lower_into(interner))
|
||||||
}
|
}
|
||||||
ty::Projection(proj) => chalk_ir::TyKind::Alias(proj.lower_into(interner)),
|
ty::Projection(proj) => chalk_ir::TyKind::Alias(proj.lower_into(interner)),
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Opaque(chalk_ir::OpaqueTy {
|
chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Opaque(chalk_ir::OpaqueTy {
|
||||||
opaque_ty_id: chalk_ir::OpaqueTyId(def_id),
|
opaque_ty_id: chalk_ir::OpaqueTyId(def_id),
|
||||||
substitution: substs.lower_into(interner),
|
substitution: substs.lower_into(interner),
|
||||||
|
@ -442,9 +442,10 @@ impl<'tcx> LowerInto<'tcx, Ty<'tcx>> for &chalk_ir::Ty<RustInterner<'tcx>> {
|
||||||
mutbl.lower_into(interner),
|
mutbl.lower_into(interner),
|
||||||
),
|
),
|
||||||
TyKind::Str => ty::Str,
|
TyKind::Str => ty::Str,
|
||||||
TyKind::OpaqueType(opaque_ty, substitution) => {
|
TyKind::OpaqueType(opaque_ty, substitution) => ty::Opaque(ty::OpaqueTy {
|
||||||
ty::Opaque(opaque_ty.0, substitution.lower_into(interner))
|
def_id: opaque_ty.0,
|
||||||
}
|
substs: substitution.lower_into(interner),
|
||||||
|
}),
|
||||||
TyKind::AssociatedType(assoc_ty, substitution) => ty::Projection(ty::ProjectionTy {
|
TyKind::AssociatedType(assoc_ty, substitution) => ty::Projection(ty::ProjectionTy {
|
||||||
substs: substitution.lower_into(interner),
|
substs: substitution.lower_into(interner),
|
||||||
item_def_id: assoc_ty.0,
|
item_def_id: assoc_ty.0,
|
||||||
|
@ -460,9 +461,10 @@ impl<'tcx> LowerInto<'tcx, Ty<'tcx>> for &chalk_ir::Ty<RustInterner<'tcx>> {
|
||||||
item_def_id: projection.associated_ty_id.0,
|
item_def_id: projection.associated_ty_id.0,
|
||||||
substs: projection.substitution.lower_into(interner),
|
substs: projection.substitution.lower_into(interner),
|
||||||
}),
|
}),
|
||||||
chalk_ir::AliasTy::Opaque(opaque) => {
|
chalk_ir::AliasTy::Opaque(opaque) => ty::Opaque(ty::OpaqueTy {
|
||||||
ty::Opaque(opaque.opaque_ty_id.0, opaque.substitution.lower_into(interner))
|
def_id: opaque.opaque_ty_id.0,
|
||||||
}
|
substs: opaque.substitution.lower_into(interner),
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
TyKind::Function(_quantified_ty) => unimplemented!(),
|
TyKind::Function(_quantified_ty) => unimplemented!(),
|
||||||
TyKind::BoundVar(_bound) => ty::Bound(
|
TyKind::BoundVar(_bound) => ty::Bound(
|
||||||
|
|
|
@ -1833,7 +1833,7 @@ pub(crate) fn clean_middle_ty<'tcx>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs }) => {
|
||||||
// Grab the "TraitA + TraitB" from `impl TraitA + TraitB`,
|
// Grab the "TraitA + TraitB" from `impl TraitA + TraitB`,
|
||||||
// by looking up the bounds associated with the def_id.
|
// by looking up the bounds associated with the def_id.
|
||||||
let bounds = cx
|
let bounds = cx
|
||||||
|
|
|
@ -4,7 +4,7 @@ use rustc_hir::intravisit::FnKind;
|
||||||
use rustc_hir::{Body, FnDecl, HirId};
|
use rustc_hir::{Body, FnDecl, HirId};
|
||||||
use rustc_infer::infer::TyCtxtInferExt;
|
use rustc_infer::infer::TyCtxtInferExt;
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_middle::ty::{Clause, EarlyBinder, Opaque, PredicateKind};
|
use rustc_middle::ty::{Clause, EarlyBinder, Opaque, OpaqueTy, PredicateKind};
|
||||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||||
use rustc_span::{sym, Span};
|
use rustc_span::{sym, Span};
|
||||||
use rustc_trait_selection::traits::error_reporting::suggestions::TypeErrCtxtExt;
|
use rustc_trait_selection::traits::error_reporting::suggestions::TypeErrCtxtExt;
|
||||||
|
@ -62,11 +62,11 @@ impl<'tcx> LateLintPass<'tcx> for FutureNotSend {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let ret_ty = return_ty(cx, hir_id);
|
let ret_ty = return_ty(cx, hir_id);
|
||||||
if let Opaque(id, subst) = *ret_ty.kind() {
|
if let Opaque(OpaqueTy { def_id, substs }) = *ret_ty.kind() {
|
||||||
let preds = cx.tcx.explicit_item_bounds(id);
|
let preds = cx.tcx.explicit_item_bounds(def_id);
|
||||||
let mut is_future = false;
|
let mut is_future = false;
|
||||||
for &(p, _span) in preds {
|
for &(p, _span) in preds {
|
||||||
let p = EarlyBinder(p).subst(cx.tcx, subst);
|
let p = EarlyBinder(p).subst(cx.tcx, substs);
|
||||||
if let Some(trait_pred) = p.to_opt_poly_trait_pred() {
|
if let Some(trait_pred) = p.to_opt_poly_trait_pred() {
|
||||||
if Some(trait_pred.skip_binder().trait_ref.def_id) == cx.tcx.lang_items().future_trait() {
|
if Some(trait_pred.skip_binder().trait_ref.def_id) == cx.tcx.lang_items().future_trait() {
|
||||||
is_future = true;
|
is_future = true;
|
||||||
|
|
|
@ -79,7 +79,7 @@ pub fn contains_ty_adt_constructor_opaque<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let ty::Opaque(def_id, _) = *inner_ty.kind() {
|
if let ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) = *inner_ty.kind() {
|
||||||
for &(predicate, _span) in cx.tcx.explicit_item_bounds(def_id) {
|
for &(predicate, _span) in cx.tcx.explicit_item_bounds(def_id) {
|
||||||
match predicate.kind().skip_binder() {
|
match predicate.kind().skip_binder() {
|
||||||
// For `impl Trait<U>`, it will register a predicate of `T: Trait<U>`, so we go through
|
// For `impl Trait<U>`, it will register a predicate of `T: Trait<U>`, so we go through
|
||||||
|
@ -250,7 +250,7 @@ pub fn is_must_use_ty<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> bool {
|
||||||
is_must_use_ty(cx, *ty)
|
is_must_use_ty(cx, *ty)
|
||||||
},
|
},
|
||||||
ty::Tuple(substs) => substs.iter().any(|ty| is_must_use_ty(cx, ty)),
|
ty::Tuple(substs) => substs.iter().any(|ty| is_must_use_ty(cx, ty)),
|
||||||
ty::Opaque(def_id, _) => {
|
ty::Opaque(ty::OpaqueTy { def_id, substs: _ }) => {
|
||||||
for (predicate, _) in cx.tcx.explicit_item_bounds(*def_id) {
|
for (predicate, _) in cx.tcx.explicit_item_bounds(*def_id) {
|
||||||
if let ty::PredicateKind::Clause(ty::Clause::Trait(trait_predicate)) = predicate.kind().skip_binder() {
|
if let ty::PredicateKind::Clause(ty::Clause::Trait(trait_predicate)) = predicate.kind().skip_binder() {
|
||||||
if cx.tcx.has_attr(trait_predicate.trait_ref.def_id, sym::must_use) {
|
if cx.tcx.has_attr(trait_predicate.trait_ref.def_id, sym::must_use) {
|
||||||
|
@ -631,7 +631,7 @@ pub fn ty_sig<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> Option<ExprFnSig<'t
|
||||||
Some(ExprFnSig::Closure(decl, subs.as_closure().sig()))
|
Some(ExprFnSig::Closure(decl, subs.as_closure().sig()))
|
||||||
},
|
},
|
||||||
ty::FnDef(id, subs) => Some(ExprFnSig::Sig(cx.tcx.bound_fn_sig(id).subst(cx.tcx, subs), Some(id))),
|
ty::FnDef(id, subs) => Some(ExprFnSig::Sig(cx.tcx.bound_fn_sig(id).subst(cx.tcx, subs), Some(id))),
|
||||||
ty::Opaque(id, _) => sig_from_bounds(cx, ty, cx.tcx.item_bounds(id), cx.tcx.opt_parent(id)),
|
ty::Opaque(ty::OpaqueTy{ def_id, substs: _ }) => sig_from_bounds(cx, ty, cx.tcx.item_bounds(def_id), cx.tcx.opt_parent(def_id)),
|
||||||
ty::FnPtr(sig) => Some(ExprFnSig::Sig(sig, None)),
|
ty::FnPtr(sig) => Some(ExprFnSig::Sig(sig, None)),
|
||||||
ty::Dynamic(bounds, _, _) => {
|
ty::Dynamic(bounds, _, _) => {
|
||||||
let lang_items = cx.tcx.lang_items();
|
let lang_items = cx.tcx.lang_items();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue