Auto merge of #52712 - oli-obk:const_eval_cleanups, r=RalfJung
Reintroduce `Undef` and properly check constant value sizes r? @RalfJung cc @eddyb basically all kinds of silent failures that never occurred are assertions now
This commit is contained in:
commit
59fa6bd6c1
28 changed files with 628 additions and 618 deletions
|
|
@ -39,10 +39,12 @@ pub fn scalar_to_llvm(
|
|||
) -> &'ll Value {
|
||||
let bitsize = if layout.is_bool() { 1 } else { layout.value.size(cx).bits() };
|
||||
match cv {
|
||||
Scalar::Bits { defined, .. } if (defined as u64) < bitsize || defined == 0 => {
|
||||
C_undef(Type::ix(cx, bitsize))
|
||||
Scalar::Bits { size: 0, .. } => {
|
||||
assert_eq!(0, layout.value.size(cx).bytes());
|
||||
C_undef(Type::ix(cx, 0))
|
||||
},
|
||||
Scalar::Bits { bits, .. } => {
|
||||
Scalar::Bits { bits, size } => {
|
||||
assert_eq!(size as u64, layout.value.size(cx).bytes());
|
||||
let llval = C_uint_big(Type::ix(cx, bitsize), bits);
|
||||
if layout.value == layout::Pointer {
|
||||
unsafe { llvm::LLVMConstIntToPtr(llval, llty) }
|
||||
|
|
@ -192,7 +194,7 @@ impl FunctionCx<'a, 'll, 'tcx> {
|
|||
mir::Field::new(field as usize),
|
||||
c,
|
||||
)?;
|
||||
if let Some(prim) = field.to_scalar() {
|
||||
if let Some(prim) = field.val.try_to_scalar() {
|
||||
let layout = bx.cx.layout_of(field_ty);
|
||||
let scalar = match layout.abi {
|
||||
layout::Abi::Scalar(ref x) => x,
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
use rustc::mir::interpret::ConstEvalErr;
|
||||
use rustc::mir;
|
||||
use rustc::mir::interpret::ConstValue;
|
||||
use rustc::mir::interpret::{ConstValue, ScalarMaybeUndef};
|
||||
use rustc::ty;
|
||||
use rustc::ty::layout::{self, Align, LayoutOf, TyLayout};
|
||||
use rustc_data_structures::indexed_vec::Idx;
|
||||
|
|
@ -110,12 +110,16 @@ impl OperandRef<'ll, 'tcx> {
|
|||
a_scalar,
|
||||
layout.scalar_pair_element_llvm_type(bx.cx, 0, true),
|
||||
);
|
||||
let b_llval = scalar_to_llvm(
|
||||
bx.cx,
|
||||
b,
|
||||
b_scalar,
|
||||
layout.scalar_pair_element_llvm_type(bx.cx, 1, true),
|
||||
);
|
||||
let b_layout = layout.scalar_pair_element_llvm_type(bx.cx, 1, true);
|
||||
let b_llval = match b {
|
||||
ScalarMaybeUndef::Scalar(b) => scalar_to_llvm(
|
||||
bx.cx,
|
||||
b,
|
||||
b_scalar,
|
||||
b_layout,
|
||||
),
|
||||
ScalarMaybeUndef::Undef => C_undef(b_layout),
|
||||
};
|
||||
OperandValue::Pair(a_llval, b_llval)
|
||||
},
|
||||
ConstValue::ByRef(alloc, offset) => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue