Start implementing needs_async_drop and related
This commit is contained in:
parent
e0904cd6a9
commit
a47173c4f7
10 changed files with 196 additions and 110 deletions
|
@ -22,17 +22,6 @@ fn is_unpin_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>)
|
|||
is_item_raw(tcx, query, LangItem::Unpin)
|
||||
}
|
||||
|
||||
fn has_surface_async_drop_raw<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>,
|
||||
) -> bool {
|
||||
is_item_raw(tcx, query, LangItem::AsyncDrop)
|
||||
}
|
||||
|
||||
fn has_surface_drop_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
|
||||
is_item_raw(tcx, query, LangItem::Drop)
|
||||
}
|
||||
|
||||
fn is_item_raw<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>,
|
||||
|
@ -45,13 +34,5 @@ fn is_item_raw<'tcx>(
|
|||
}
|
||||
|
||||
pub(crate) fn provide(providers: &mut Providers) {
|
||||
*providers = Providers {
|
||||
is_copy_raw,
|
||||
is_sized_raw,
|
||||
is_freeze_raw,
|
||||
is_unpin_raw,
|
||||
has_surface_async_drop_raw,
|
||||
has_surface_drop_raw,
|
||||
..*providers
|
||||
};
|
||||
*providers = Providers { is_copy_raw, is_sized_raw, is_freeze_raw, is_unpin_raw, ..*providers };
|
||||
}
|
||||
|
|
|
@ -30,6 +30,21 @@ fn needs_drop_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>
|
|||
res
|
||||
}
|
||||
|
||||
fn needs_async_drop_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
|
||||
// If we don't know a type doesn't need async drop, for example if it's a
|
||||
// type parameter without a `Copy` bound, then we conservatively return that
|
||||
// it needs async drop.
|
||||
let adt_has_async_dtor =
|
||||
|adt_def: ty::AdtDef<'tcx>| adt_def.async_destructor(tcx).map(|_| DtorType::Significant);
|
||||
let res = drop_tys_helper(tcx, query.value, query.param_env, adt_has_dtor, false)
|
||||
.filter(filter_array_elements(tcx, query.param_env))
|
||||
.next()
|
||||
.is_some();
|
||||
|
||||
debug!("needs_drop_raw({:?}) = {:?}", query, res);
|
||||
res
|
||||
}
|
||||
|
||||
/// HACK: in order to not mistakenly assume that `[PhantomData<T>; N]` requires drop glue
|
||||
/// we check the element type for drop glue. The correct fix would be looking at the
|
||||
/// entirety of the code around `needs_drop_components` and this file and come up with
|
||||
|
@ -389,6 +404,7 @@ fn adt_significant_drop_tys(
|
|||
pub(crate) fn provide(providers: &mut Providers) {
|
||||
*providers = Providers {
|
||||
needs_drop_raw,
|
||||
needs_async_drop_raw,
|
||||
has_significant_drop_raw,
|
||||
adt_drop_tys,
|
||||
adt_significant_drop_tys,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue