stride * field
}
layout::FieldPlacement::Union(count) => {
+ // This is a narrow bug-fix for rust-lang/rust#69191: if we are
+ // trying to access absent field of uninhabited variant, then
+ // signal UB (but don't ICE the compiler).
+ // FIXME temporary hack to work around incoherence between
+ // layout computation and MIR building
+ if field >= count as u64 && base.layout.abi == layout::Abi::Uninhabited {
+ throw_ub!(Unreachable);
+ }
assert!(
field < count as u64,
"Tried to access field {} of union {:#?} with {} fields",
// happens at run-time so that's okay.
let align = match self.size_and_align_of(base.meta, field_layout)? {
Some((_, align)) => align,
- None if offset == Size::ZERO =>
- // An extern type at offset 0, we fall back to its static alignment.
- // FIXME: Once we have made decisions for how to handle size and alignment
- // of `extern type`, this should be adapted. It is just a temporary hack
- // to get some code to work that probably ought to work.
- {
+ None if offset == Size::ZERO => {
+ // An extern type at offset 0, we fall back to its static alignment.
+ // FIXME: Once we have made decisions for how to handle size and alignment
+ // of `extern type`, this should be adapted. It is just a temporary hack
+ // to get some code to work that probably ought to work.
field_layout.align.abi
}
None => bug!("Cannot compute offset for extern type field at non-0 offset"),
}
local => PlaceTy {
// This works even for dead/uninitialized locals; we check further when writing
- place: Place::Local { frame: self.cur_frame(), local: local },
+ place: Place::Local { frame: self.cur_frame(), local },
layout: self.layout_of_local(self.frame(), local, None)?,
},
};