Add a few more comments
This commit is contained in:
parent
f1fef64e19
commit
541858ed78
@ -101,7 +101,7 @@ pub enum InstanceDef<'tcx> {
|
|||||||
// because the signature of `<{async fn} as FnMut>::call_mut` is:
|
// because the signature of `<{async fn} as FnMut>::call_mut` is:
|
||||||
// `fn(&mut self, args: A) -> <Self as FnOnce>::Output`, that is to say
|
// `fn(&mut self, args: A) -> <Self as FnOnce>::Output`, that is to say
|
||||||
// that it returns the `FnOnce`-flavored coroutine but takes the closure
|
// that it returns the `FnOnce`-flavored coroutine but takes the closure
|
||||||
// by ref (and similarly for `Fn::call`).
|
// by mut ref (and similarly for `Fn::call`).
|
||||||
receiver_by_ref: bool,
|
receiver_by_ref: bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -2461,6 +2461,10 @@ impl<'tcx> Ty<'tcx> {
|
|||||||
/// `AsyncFn`/`AsyncFnMut`/`AsyncFnOnce`, we only need to distinguish two coroutine
|
/// `AsyncFn`/`AsyncFnMut`/`AsyncFnOnce`, we only need to distinguish two coroutine
|
||||||
/// bodies: by-ref and by-value.
|
/// bodies: by-ref and by-value.
|
||||||
///
|
///
|
||||||
|
/// See the definition of `AsyncFn` and `AsyncFnMut` and the `CallRefFuture`
|
||||||
|
/// associated type for why we don't distinguish [`ty::ClosureKind::Fn`] and
|
||||||
|
/// [`ty::ClosureKind::FnMut`] for the purpose of the generated MIR bodies.
|
||||||
|
///
|
||||||
/// This method should be used when constructing a `Coroutine` out of a
|
/// This method should be used when constructing a `Coroutine` out of a
|
||||||
/// `CoroutineClosure`, when the `Coroutine`'s `kind` field is being populated
|
/// `CoroutineClosure`, when the `Coroutine`'s `kind` field is being populated
|
||||||
/// directly from the `CoroutineClosure`'s `kind`.
|
/// directly from the `CoroutineClosure`'s `kind`.
|
||||||
|
@ -1023,7 +1023,16 @@ fn build_construct_coroutine_by_move_shim<'tcx>(
|
|||||||
bug!();
|
bug!();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// We use `*mut Self` here because we only need to emit an ABI-compatible shim body,
|
||||||
|
// rather than match the signature exactly.
|
||||||
|
//
|
||||||
|
// The self type here is a coroutine-closure, not a coroutine, and we never read from
|
||||||
|
// it because it never has any captures, because this is only true in the Fn/FnMut
|
||||||
|
// implementation, not the AsyncFn/AsyncFnMut implementation, which is implemented only
|
||||||
|
// if the coroutine-closure has no captures.
|
||||||
if receiver_by_ref {
|
if receiver_by_ref {
|
||||||
|
// Triple-check that there's no captures here.
|
||||||
|
assert_eq!(args.as_coroutine_closure().tupled_upvars_ty(), tcx.types.unit);
|
||||||
self_ty = Ty::new_mut_ptr(tcx, self_ty);
|
self_ty = Ty::new_mut_ptr(tcx, self_ty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user