Layout error instead of an ICE for packed and aligned types
This commit is contained in:
parent
b9197978a9
commit
d49f977ed9
@ -312,7 +312,8 @@ fn univariant_uninterned(
|
||||
let dl = self.data_layout();
|
||||
let pack = repr.pack;
|
||||
if pack.is_some() && repr.align.is_some() {
|
||||
bug!("struct cannot be packed and aligned");
|
||||
self.tcx.sess.delay_span_bug(DUMMY_SP, "struct cannot be packed and aligned");
|
||||
return Err(LayoutError::Unknown(ty));
|
||||
}
|
||||
|
||||
let mut align = if pack.is_some() { dl.i8_align } else { dl.aggregate_align };
|
||||
@ -808,7 +809,11 @@ fn layout_raw_uncached(&self, ty: Ty<'tcx>) -> Result<&'tcx Layout, LayoutError<
|
||||
|
||||
if def.is_union() {
|
||||
if def.repr.pack.is_some() && def.repr.align.is_some() {
|
||||
bug!("union cannot be packed and aligned");
|
||||
self.tcx.sess.delay_span_bug(
|
||||
tcx.def_span(def.did),
|
||||
"union cannot be packed and aligned",
|
||||
);
|
||||
return Err(LayoutError::Unknown(ty));
|
||||
}
|
||||
|
||||
let mut align =
|
||||
|
@ -66,4 +66,15 @@ union Z {
|
||||
i: i32,
|
||||
}
|
||||
|
||||
#[repr(packed, align(0x100))]
|
||||
pub struct S(u16); //~ ERROR type has conflicting packed and align representation hints
|
||||
|
||||
#[repr(packed, align(0x100))]
|
||||
pub union U { //~ ERROR type has conflicting packed and align representation hints
|
||||
u: u16
|
||||
}
|
||||
|
||||
static B: U = U { u: 0 };
|
||||
static A: S = S(0);
|
||||
|
||||
fn main() {}
|
||||
|
@ -74,7 +74,21 @@ LL | | i: i32,
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
error[E0587]: type has conflicting packed and align representation hints
|
||||
--> $DIR/conflicting-repr-hints.rs:70:1
|
||||
|
|
||||
LL | pub struct S(u16);
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0587]: type has conflicting packed and align representation hints
|
||||
--> $DIR/conflicting-repr-hints.rs:73:1
|
||||
|
|
||||
LL | / pub union U {
|
||||
LL | | u: u16
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to 12 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0566, E0587, E0634.
|
||||
For more information about an error, try `rustc --explain E0566`.
|
||||
|
Loading…
Reference in New Issue
Block a user