Auto merge of #88371 - Manishearth:rollup-pkkjsme, r=Manishearth
Rollup of 11 pull requests Successful merges: - #87832 (Fix debugger stepping behavior with `match` expressions) - #88123 (Make spans for tuple patterns in E0023 more precise) - #88215 (Reland #83738: "rustdoc: Don't load all extern crates unconditionally") - #88216 (Don't stabilize creation of TryReserveError instances) - #88270 (Handle type ascription type ops in NLL HRTB diagnostics) - #88289 (Fixes for LLVM change 0f45c16f2caa7c035e5c3edd40af9e0d51ad6ba7) - #88320 (type_implements_trait consider obligation failure on overflow) - #88332 (Add argument types tait tests) - #88340 (Add `c_size_t` and `c_ssize_t` to `std::os::raw`.) - #88346 (Revert "Add type of a let tait test impl trait straight in let") - #88348 (Add field types tait tests) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
d5cd3205fd
140 changed files with 2390 additions and 711 deletions
|
@ -19,7 +19,7 @@ mod normalize_erasing_regions;
|
|||
mod normalize_projection_ty;
|
||||
mod type_op;
|
||||
|
||||
pub use type_op::type_op_prove_predicate_with_span;
|
||||
pub use type_op::{type_op_ascribe_user_type_with_span, type_op_prove_predicate_with_span};
|
||||
|
||||
use rustc_middle::ty::query::Providers;
|
||||
|
||||
|
|
|
@ -40,20 +40,30 @@ fn type_op_ascribe_user_type<'tcx>(
|
|||
canonicalized: Canonical<'tcx, ParamEnvAnd<'tcx, AscribeUserType<'tcx>>>,
|
||||
) -> Result<&'tcx Canonical<'tcx, QueryResponse<'tcx, ()>>, NoSolution> {
|
||||
tcx.infer_ctxt().enter_canonical_trait_query(&canonicalized, |infcx, fulfill_cx, key| {
|
||||
let (param_env, AscribeUserType { mir_ty, def_id, user_substs }) = key.into_parts();
|
||||
|
||||
debug!(
|
||||
"type_op_ascribe_user_type: mir_ty={:?} def_id={:?} user_substs={:?}",
|
||||
mir_ty, def_id, user_substs
|
||||
);
|
||||
|
||||
let mut cx = AscribeUserTypeCx { infcx, param_env, fulfill_cx };
|
||||
cx.relate_mir_and_user_ty(mir_ty, def_id, user_substs)?;
|
||||
|
||||
Ok(())
|
||||
type_op_ascribe_user_type_with_span(infcx, fulfill_cx, key, None)
|
||||
})
|
||||
}
|
||||
|
||||
/// The core of the `type_op_ascribe_user_type` query: for diagnostics purposes in NLL HRTB errors,
|
||||
/// this query can be re-run to better track the span of the obligation cause, and improve the error
|
||||
/// message. Do not call directly unless you're in that very specific context.
|
||||
pub fn type_op_ascribe_user_type_with_span<'a, 'tcx: 'a>(
|
||||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
fulfill_cx: &'a mut dyn TraitEngine<'tcx>,
|
||||
key: ParamEnvAnd<'tcx, AscribeUserType<'tcx>>,
|
||||
span: Option<Span>,
|
||||
) -> Result<(), NoSolution> {
|
||||
let (param_env, AscribeUserType { mir_ty, def_id, user_substs }) = key.into_parts();
|
||||
debug!(
|
||||
"type_op_ascribe_user_type: mir_ty={:?} def_id={:?} user_substs={:?}",
|
||||
mir_ty, def_id, user_substs
|
||||
);
|
||||
|
||||
let mut cx = AscribeUserTypeCx { infcx, param_env, fulfill_cx };
|
||||
cx.relate_mir_and_user_ty(mir_ty, def_id, user_substs, span)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
struct AscribeUserTypeCx<'me, 'tcx> {
|
||||
infcx: &'me InferCtxt<'me, 'tcx>,
|
||||
param_env: ParamEnv<'tcx>,
|
||||
|
@ -85,10 +95,15 @@ impl AscribeUserTypeCx<'me, 'tcx> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn prove_predicate(&mut self, predicate: Predicate<'tcx>) {
|
||||
fn prove_predicate(&mut self, predicate: Predicate<'tcx>, span: Option<Span>) {
|
||||
let cause = if let Some(span) = span {
|
||||
ObligationCause::dummy_with_span(span)
|
||||
} else {
|
||||
ObligationCause::dummy()
|
||||
};
|
||||
self.fulfill_cx.register_predicate_obligation(
|
||||
self.infcx,
|
||||
Obligation::new(ObligationCause::dummy(), self.param_env, predicate),
|
||||
Obligation::new(cause, self.param_env, predicate),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -108,6 +123,7 @@ impl AscribeUserTypeCx<'me, 'tcx> {
|
|||
mir_ty: Ty<'tcx>,
|
||||
def_id: DefId,
|
||||
user_substs: UserSubsts<'tcx>,
|
||||
span: Option<Span>,
|
||||
) -> Result<(), NoSolution> {
|
||||
let UserSubsts { user_self_ty, substs } = user_substs;
|
||||
let tcx = self.tcx();
|
||||
|
@ -129,7 +145,7 @@ impl AscribeUserTypeCx<'me, 'tcx> {
|
|||
debug!(?instantiated_predicates.predicates);
|
||||
for instantiated_predicate in instantiated_predicates.predicates {
|
||||
let instantiated_predicate = self.normalize(instantiated_predicate);
|
||||
self.prove_predicate(instantiated_predicate);
|
||||
self.prove_predicate(instantiated_predicate, span);
|
||||
}
|
||||
|
||||
if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
|
||||
|
@ -141,6 +157,7 @@ impl AscribeUserTypeCx<'me, 'tcx> {
|
|||
|
||||
self.prove_predicate(
|
||||
ty::PredicateKind::WellFormed(impl_self_ty.into()).to_predicate(self.tcx()),
|
||||
span,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -155,7 +172,10 @@ impl AscribeUserTypeCx<'me, 'tcx> {
|
|||
// them? This would only be relevant if some input
|
||||
// type were ill-formed but did not appear in `ty`,
|
||||
// which...could happen with normalization...
|
||||
self.prove_predicate(ty::PredicateKind::WellFormed(ty.into()).to_predicate(self.tcx()));
|
||||
self.prove_predicate(
|
||||
ty::PredicateKind::WellFormed(ty.into()).to_predicate(self.tcx()),
|
||||
span,
|
||||
);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue