Make sure we actually use the right trivial lifetime substs when eagerly monomorphizing drop for structs
This commit is contained in:
parent
8361aef0d7
commit
c89ee081dd
3 changed files with 32 additions and 5 deletions
|
@ -1410,19 +1410,33 @@ impl<'v> RootCollector<'_, 'v> {
|
||||||
&& !self.tcx.generics_of(id.owner_id).requires_monomorphization(self.tcx)
|
&& !self.tcx.generics_of(id.owner_id).requires_monomorphization(self.tcx)
|
||||||
{
|
{
|
||||||
debug!("RootCollector: ADT drop-glue for `{id:?}`",);
|
debug!("RootCollector: ADT drop-glue for `{id:?}`",);
|
||||||
|
let id_args =
|
||||||
|
ty::GenericArgs::for_item(self.tcx, id.owner_id.to_def_id(), |param, _| {
|
||||||
|
match param.kind {
|
||||||
|
GenericParamDefKind::Lifetime => {
|
||||||
|
self.tcx.lifetimes.re_erased.into()
|
||||||
|
}
|
||||||
|
GenericParamDefKind::Type { .. }
|
||||||
|
| GenericParamDefKind::Const { .. } => {
|
||||||
|
unreachable!(
|
||||||
|
"`own_requires_monomorphization` check means that \
|
||||||
|
we should have no type/const params"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// This type is impossible to instantiate, so we should not try to
|
// This type is impossible to instantiate, so we should not try to
|
||||||
// generate a `drop_in_place` instance for it.
|
// generate a `drop_in_place` instance for it.
|
||||||
if self.tcx.instantiate_and_check_impossible_predicates((
|
if self.tcx.instantiate_and_check_impossible_predicates((
|
||||||
id.owner_id.to_def_id(),
|
id.owner_id.to_def_id(),
|
||||||
ty::List::empty(),
|
id_args,
|
||||||
)) {
|
)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let ty = self.tcx.erase_regions(
|
let ty =
|
||||||
self.tcx.type_of(id.owner_id.to_def_id()).instantiate_identity(),
|
self.tcx.type_of(id.owner_id.to_def_id()).instantiate(self.tcx, id_args);
|
||||||
);
|
|
||||||
assert!(!ty.has_non_region_param());
|
assert!(!ty.has_non_region_param());
|
||||||
visit_drop_use(self.tcx, ty, true, DUMMY_SP, self.output);
|
visit_drop_use(self.tcx, ty, true, DUMMY_SP, self.output);
|
||||||
}
|
}
|
||||||
|
|
|
@ -804,7 +804,7 @@ impl<'a, I: Interner> ArgFolder<'a, I> {
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
fn region_param_out_of_range(&self, ebr: I::EarlyParamRegion, r: I::Region) -> ! {
|
fn region_param_out_of_range(&self, ebr: I::EarlyParamRegion, r: I::Region) -> ! {
|
||||||
panic!(
|
panic!(
|
||||||
"const parameter `{:?}` ({:?}/{}) out of range when instantiating args={:?}",
|
"region parameter `{:?}` ({:?}/{}) out of range when instantiating args={:?}",
|
||||||
ebr,
|
ebr,
|
||||||
r,
|
r,
|
||||||
ebr.index(),
|
ebr.index(),
|
||||||
|
|
|
@ -41,3 +41,16 @@ impl<'a> Drop for StructWithDropAndLt<'a> {
|
||||||
struct StructWithDropAndLt<'a> {
|
struct StructWithDropAndLt<'a> {
|
||||||
x: &'a i32,
|
x: &'a i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure we don't ICE when checking impossible predicates for the struct.
|
||||||
|
// Regression test for <https://github.com/rust-lang/rust/issues/135515>.
|
||||||
|
//~ MONO_ITEM fn std::ptr::drop_in_place::<StructWithLtAndPredicate<'_>> - shim(Some(StructWithLtAndPredicate<'_>))
|
||||||
|
struct StructWithLtAndPredicate<'a: 'a> {
|
||||||
|
x: &'a i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
// We should be able to monomorphize drops for struct with lifetimes.
|
||||||
|
impl<'a> Drop for StructWithLtAndPredicate<'a> {
|
||||||
|
//~ MONO_ITEM fn <StructWithLtAndPredicate<'_> as std::ops::Drop>::drop
|
||||||
|
fn drop(&mut self) {}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue