Rollup merge of #124027 - oli-obk:define_opaque_types9, r=compiler-errors
Prefer identity equality over equating types during coercion. These types are always generic only over their own generic parameters with no inference variables involved. r? `@compiler-errors` I love touching code that [hasn't changed meaningfully since 2016](https://github.com/rust-lang/rust/pull/41937)
This commit is contained in:
commit
c7b009f38a
@ -10,8 +10,8 @@ use rustc_hir::def_id::{DefId, LocalDefId};
|
|||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_hir::ItemKind;
|
use rustc_hir::ItemKind;
|
||||||
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
|
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
|
||||||
|
use rustc_infer::infer::TyCtxtInferExt;
|
||||||
use rustc_infer::infer::{self, RegionResolutionError};
|
use rustc_infer::infer::{self, RegionResolutionError};
|
||||||
use rustc_infer::infer::{DefineOpaqueTypes, TyCtxtInferExt};
|
|
||||||
use rustc_infer::traits::Obligation;
|
use rustc_infer::traits::Obligation;
|
||||||
use rustc_middle::ty::adjustment::CoerceUnsizedInfo;
|
use rustc_middle::ty::adjustment::CoerceUnsizedInfo;
|
||||||
use rustc_middle::ty::{self, suggest_constraining_type_params, Ty, TyCtxt, TypeVisitableExt};
|
use rustc_middle::ty::{self, suggest_constraining_type_params, Ty, TyCtxt, TypeVisitableExt};
|
||||||
@ -189,10 +189,7 @@ fn visit_implementation_of_dispatch_from_dyn(checker: &Checker<'_>) -> Result<()
|
|||||||
// even if they do not carry that attribute.
|
// even if they do not carry that attribute.
|
||||||
use rustc_type_ir::TyKind::*;
|
use rustc_type_ir::TyKind::*;
|
||||||
match (source.kind(), target.kind()) {
|
match (source.kind(), target.kind()) {
|
||||||
(&Ref(r_a, _, mutbl_a), Ref(r_b, _, mutbl_b))
|
(&Ref(r_a, _, mutbl_a), Ref(r_b, _, mutbl_b)) if r_a == *r_b && mutbl_a == *mutbl_b => {
|
||||||
if infcx.at(&cause, param_env).eq(DefineOpaqueTypes::No, r_a, *r_b).is_ok()
|
|
||||||
&& mutbl_a == *mutbl_b =>
|
|
||||||
{
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
(&RawPtr(_, a_mutbl), &RawPtr(_, b_mutbl)) if a_mutbl == b_mutbl => Ok(()),
|
(&RawPtr(_, a_mutbl), &RawPtr(_, b_mutbl)) if a_mutbl == b_mutbl => Ok(()),
|
||||||
@ -230,10 +227,7 @@ fn visit_implementation_of_dispatch_from_dyn(checker: &Checker<'_>) -> Result<()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Ok(ok) =
|
if ty_a == ty_b {
|
||||||
infcx.at(&cause, param_env).eq(DefineOpaqueTypes::No, ty_a, ty_b)
|
|
||||||
{
|
|
||||||
if ok.obligations.is_empty() {
|
|
||||||
res = Err(tcx.dcx().emit_err(errors::DispatchFromDynZST {
|
res = Err(tcx.dcx().emit_err(errors::DispatchFromDynZST {
|
||||||
span,
|
span,
|
||||||
name: field.name,
|
name: field.name,
|
||||||
@ -242,7 +236,6 @@ fn visit_implementation_of_dispatch_from_dyn(checker: &Checker<'_>) -> Result<()
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
@ -433,15 +426,13 @@ pub fn coerce_unsized_info<'tcx>(
|
|||||||
// something more accepting, but we use
|
// something more accepting, but we use
|
||||||
// equality because we want to be able to
|
// equality because we want to be able to
|
||||||
// perform this check without computing
|
// perform this check without computing
|
||||||
// variance where possible. (This is because
|
// variance or constraining opaque types' hidden types.
|
||||||
// we may have to evaluate constraint
|
// (This is because we may have to evaluate constraint
|
||||||
// expressions in the course of execution.)
|
// expressions in the course of execution.)
|
||||||
// See e.g., #41936.
|
// See e.g., #41936.
|
||||||
if let Ok(ok) = infcx.at(&cause, param_env).eq(DefineOpaqueTypes::No, a, b) {
|
if a == b {
|
||||||
if ok.obligations.is_empty() {
|
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Collect up all fields that were significantly changed
|
// Collect up all fields that were significantly changed
|
||||||
// i.e., those that contain T in coerce_unsized T -> U
|
// i.e., those that contain T in coerce_unsized T -> U
|
||||||
|
Loading…
x
Reference in New Issue
Block a user