interpret: use ConstPropNonsense for more const-prop induced issues
This commit is contained in:
parent
a339ed184f
commit
efd54ccf5a
@ -826,10 +826,10 @@ where
|
|||||||
// predicate like `where Self: Sized` with `Self = dyn Trait`.
|
// predicate like `where Self: Sized` with `Self = dyn Trait`.
|
||||||
// See #102553 for an example of such a predicate.
|
// See #102553 for an example of such a predicate.
|
||||||
if src.layout().is_unsized() {
|
if src.layout().is_unsized() {
|
||||||
throw_inval!(SizeOfUnsizedType(src.layout().ty));
|
throw_inval!(ConstPropNonsense);
|
||||||
}
|
}
|
||||||
if dest.layout().is_unsized() {
|
if dest.layout().is_unsized() {
|
||||||
throw_inval!(SizeOfUnsizedType(dest.layout().ty));
|
throw_inval!(ConstPropNonsense);
|
||||||
}
|
}
|
||||||
assert_eq!(src.layout().size, dest.layout().size);
|
assert_eq!(src.layout().size, dest.layout().size);
|
||||||
// Yay, we got a value that we can write directly.
|
// Yay, we got a value that we can write directly.
|
||||||
|
@ -101,7 +101,7 @@ where
|
|||||||
let (meta, offset) = if field_layout.is_unsized() {
|
let (meta, offset) = if field_layout.is_unsized() {
|
||||||
if base.layout().is_sized() {
|
if base.layout().is_sized() {
|
||||||
// An unsized field of a sized type? Sure...
|
// An unsized field of a sized type? Sure...
|
||||||
// But const-prop actually feeds us such nonsense MIR!
|
// But const-prop actually feeds us such nonsense MIR! (see test `const_prop/issue-86351.rs`)
|
||||||
throw_inval!(ConstPropNonsense);
|
throw_inval!(ConstPropNonsense);
|
||||||
}
|
}
|
||||||
let base_meta = base.meta(self)?;
|
let base_meta = base.meta(self)?;
|
||||||
|
@ -269,7 +269,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
let ty = self.subst_from_current_frame_and_normalize_erasing_regions(ty)?;
|
let ty = self.subst_from_current_frame_and_normalize_erasing_regions(ty)?;
|
||||||
let layout = self.layout_of(ty)?;
|
let layout = self.layout_of(ty)?;
|
||||||
if let mir::NullOp::SizeOf | mir::NullOp::AlignOf = null_op && layout.is_unsized() {
|
if let mir::NullOp::SizeOf | mir::NullOp::AlignOf = null_op && layout.is_unsized() {
|
||||||
// FIXME: This should be a span_bug (#80742)
|
// FIXME: This should be a span_bug, but const generics can run MIR
|
||||||
|
// that is not properly type-checked yet (#97477).
|
||||||
self.tcx.sess.delay_span_bug(
|
self.tcx.sess.delay_span_bug(
|
||||||
self.frame().current_span(),
|
self.frame().current_span(),
|
||||||
format!("{null_op:?} MIR operator called for unsized type {ty}"),
|
format!("{null_op:?} MIR operator called for unsized type {ty}"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user