1
Fork 0

Rollup merge of #70189 - RalfJung:is_signed, r=eddyb

Abi::is_signed: assert that we are a Scalar

A bit more sanity checking, suggested by @eddyb. This makes this method actually "safer" than `TyS::is_signed`, so I made sure Miri consistently uses the `Abi` version.

Though I am not sure if this would have caught the mistake where the layout of a zero-sized enum was asked for its sign.

r? @eddyb
This commit is contained in:
Mazdak Farrokhzad 2020-03-21 05:33:35 +01:00 committed by GitHub
commit 937ca434b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 2 additions and 2 deletions

View file

@ -604,7 +604,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
.not_undef() .not_undef()
.and_then(|raw_discr| self.force_bits(raw_discr, discr_val.layout.size)) .and_then(|raw_discr| self.force_bits(raw_discr, discr_val.layout.size))
.map_err(|_| err_ub!(InvalidDiscriminant(raw_discr.erase_tag())))?; .map_err(|_| err_ub!(InvalidDiscriminant(raw_discr.erase_tag())))?;
let real_discr = if discr_val.layout.ty.is_signed() { let real_discr = if discr_val.layout.abi.is_signed() {
// going from layout tag type to typeck discriminant type // going from layout tag type to typeck discriminant type
// requires first sign extending with the discriminant layout // requires first sign extending with the discriminant layout
let sexted = sign_extend(bits_discr, discr_val.layout.size) as i128; let sexted = sign_extend(bits_discr, discr_val.layout.size) as i128;

View file

@ -751,7 +751,7 @@ impl Abi {
Primitive::Int(_, signed) => signed, Primitive::Int(_, signed) => signed,
_ => false, _ => false,
}, },
_ => false, _ => panic!("`is_signed` on non-scalar ABI {:?}", self),
} }
} }