// Foreign types can never have destructors.
ty::Foreign(..) => Ok(SmallVec::new()),
- // Pessimistically assume that all generators will require destructors
- // as we don't know if a destructor is a noop or not until after the MIR
- // state transformation pass.
- ty::Generator(..) | ty::Dynamic(..) | ty::Error => Err(AlwaysRequiresDrop),
+ ty::Dynamic(..) | ty::Error => Err(AlwaysRequiresDrop),
ty::Slice(ty) => needs_drop_components(ty, target_layout),
ty::Array(elem_ty, size) => {
| ty::Placeholder(..)
| ty::Opaque(..)
| ty::Infer(_)
- | ty::Closure(..) => Ok(smallvec![ty]),
+ | ty::Closure(..)
+ | ty::Generator(..) => Ok(smallvec![ty]),
}
}
}
}
+ ty::Generator(def_id, substs, _) => {
+ let substs = substs.as_generator();
+ for upvar_ty in substs.upvar_tys(def_id, tcx) {
+ queue_type(self, upvar_ty);
+ }
+
+ let witness = substs.witness(def_id, tcx);
+ let interior_tys = match &witness.kind {
+ ty::GeneratorWitness(tys) => tcx.erase_late_bound_regions(tys),
+ _ => bug!(),
+ };
+
+ for interior_ty in interior_tys {
+ queue_type(self, interior_ty);
+ }
+ }
+
// Check for a `Drop` impl and whether this is a union or
// `ManuallyDrop`. If it's a struct or enum without a `Drop`
// impl then check whether the field types need `Drop`.
error[E0597]: `a` does not live long enough
--> $DIR/borrowing.rs:9:33
|
+LL | let _b = {
+ | -- borrow later stored here
+LL | let a = 3;
LL | Pin::new(&mut || yield &a).resume(())
- | ----------^
- | | |
- | | borrowed value does not live long enough
+ | -- ^ borrowed value does not live long enough
+ | |
| value captured here by generator
- | a temporary with access to the borrow is created here ...
LL |
LL | };
- | -- ... and the borrow might be used here, when that temporary is dropped and runs the destructor for generator
- | |
- | `a` dropped here while still borrowed
- |
- = note: The temporary is part of an expression at the end of a block. Consider forcing this temporary to be dropped sooner, before the block's local variables are dropped. For example, you could save the expression's value in a new local variable `x` and then make `x` be the expression at the end of the block.
+ | - `a` dropped here while still borrowed
error[E0597]: `a` does not live long enough
--> $DIR/borrowing.rs:16:20
LL | gen.as_mut().resume(&mut thing);
| ---------- first mutable borrow occurs here
LL | gen.as_mut().resume(&mut thing);
- | ^^^^^^^^^^ second mutable borrow occurs here
-LL |
-LL | }
- | - first borrow might be used here, when `gen` is dropped and runs the destructor for generator
+ | ------ ^^^^^^^^^^ second mutable borrow occurs here
+ | |
+ | first borrow later used by call
error: aborting due to previous error