Rollup merge of #97183 - oli-obk:tait_ice_async, r=jackh726
wf-check generators fixes #90409 We should not rely on generators being well formed by construction now that they can get used via type alias impl trait (and thus users can choose generic arguments that are invalid). This can cause surprising behaviour if (definitely unsound) transmutes are used, and it's generally saner to just check for well formedness.
This commit is contained in:
commit
881e1c1a8b
7 changed files with 101 additions and 10 deletions
|
@ -295,6 +295,7 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> {
|
|||
/// This is called much less often than `needs_process_obligation`, so we
|
||||
/// never inline it.
|
||||
#[inline(never)]
|
||||
#[instrument(level = "debug", skip(self, pending_obligation))]
|
||||
fn process_obligation(
|
||||
&mut self,
|
||||
pending_obligation: &mut PendingPredicateObligation<'tcx>,
|
||||
|
@ -303,7 +304,7 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> {
|
|||
|
||||
let obligation = &mut pending_obligation.obligation;
|
||||
|
||||
debug!(?obligation, "process_obligation pre-resolve");
|
||||
debug!(?obligation, "pre-resolve");
|
||||
|
||||
if obligation.predicate.has_infer_types_or_consts() {
|
||||
obligation.predicate =
|
||||
|
@ -312,8 +313,6 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> {
|
|||
|
||||
let obligation = &pending_obligation.obligation;
|
||||
|
||||
debug!(?obligation, ?obligation.cause, "process_obligation");
|
||||
|
||||
let infcx = self.selcx.infcx();
|
||||
|
||||
if obligation.predicate.has_projections() {
|
||||
|
|
|
@ -559,7 +559,7 @@ impl<'tcx> WfPredicates<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
ty::Generator(..) => {
|
||||
ty::Generator(did, substs, ..) => {
|
||||
// Walk ALL the types in the generator: this will
|
||||
// include the upvar types as well as the yield
|
||||
// type. Note that this is mildly distinct from
|
||||
|
@ -567,6 +567,8 @@ impl<'tcx> WfPredicates<'tcx> {
|
|||
// about the signature of the closure. We don't
|
||||
// have the problem of implied bounds here since
|
||||
// generators don't take arguments.
|
||||
let obligations = self.nominal_obligations(did, substs);
|
||||
self.out.extend(obligations);
|
||||
}
|
||||
|
||||
ty::Closure(did, substs) => {
|
||||
|
@ -618,11 +620,9 @@ impl<'tcx> WfPredicates<'tcx> {
|
|||
}
|
||||
|
||||
ty::Opaque(did, substs) => {
|
||||
// all of the requirements on type parameters
|
||||
// should've been checked by the instantiation
|
||||
// of whatever returned this exact `impl Trait`.
|
||||
|
||||
// for named opaque `impl Trait` types we still need to check them
|
||||
// All of the requirements on type parameters
|
||||
// have already been checked for `impl Trait` in
|
||||
// return position. We do need to check type-alias-impl-trait though.
|
||||
if ty::is_impl_trait_defn(self.tcx, did).is_none() {
|
||||
let obligations = self.nominal_obligations(did, substs);
|
||||
self.out.extend(obligations);
|
||||
|
@ -684,6 +684,7 @@ impl<'tcx> WfPredicates<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
fn nominal_obligations(
|
||||
&mut self,
|
||||
def_id: DefId,
|
||||
|
@ -698,6 +699,7 @@ impl<'tcx> WfPredicates<'tcx> {
|
|||
}
|
||||
|
||||
let predicates = predicates.instantiate(self.tcx, substs);
|
||||
trace!("{:#?}", predicates);
|
||||
debug_assert_eq!(predicates.predicates.len(), origins.len());
|
||||
|
||||
iter::zip(iter::zip(predicates.predicates, predicates.spans), origins.into_iter().rev())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue