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)
|
||||
{
|
||||
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
|
||||
// generate a `drop_in_place` instance for it.
|
||||
if self.tcx.instantiate_and_check_impossible_predicates((
|
||||
id.owner_id.to_def_id(),
|
||||
ty::List::empty(),
|
||||
id_args,
|
||||
)) {
|
||||
return;
|
||||
}
|
||||
|
||||
let ty = self.tcx.erase_regions(
|
||||
self.tcx.type_of(id.owner_id.to_def_id()).instantiate_identity(),
|
||||
);
|
||||
let ty =
|
||||
self.tcx.type_of(id.owner_id.to_def_id()).instantiate(self.tcx, id_args);
|
||||
assert!(!ty.has_non_region_param());
|
||||
visit_drop_use(self.tcx, ty, true, DUMMY_SP, self.output);
|
||||
}
|
||||
|
|
|
@ -804,7 +804,7 @@ impl<'a, I: Interner> ArgFolder<'a, I> {
|
|||
#[inline(never)]
|
||||
fn region_param_out_of_range(&self, ebr: I::EarlyParamRegion, r: I::Region) -> ! {
|
||||
panic!(
|
||||
"const parameter `{:?}` ({:?}/{}) out of range when instantiating args={:?}",
|
||||
"region parameter `{:?}` ({:?}/{}) out of range when instantiating args={:?}",
|
||||
ebr,
|
||||
r,
|
||||
ebr.index(),
|
||||
|
|
|
@ -41,3 +41,16 @@ impl<'a> Drop for StructWithDropAndLt<'a> {
|
|||
struct StructWithDropAndLt<'a> {
|
||||
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