Skip to content

Commit 12b43b2

Browse files
committed
add range assert when loading bools
1 parent 0262e4b commit 12b43b2

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

src/librustc/middle/trans/build.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use lib::llvm::{Opcode, IntPredicate, RealPredicate, True, False};
1616
use lib::llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef, ModuleRef};
1717
use libc::{c_uint, c_int, c_ulonglong};
1818
use middle::trans::common::*;
19+
use middle::trans::machine::llsize_of_real;
1920

2021
use core::cast::transmute;
2122
use core::cast;
@@ -540,13 +541,11 @@ pub fn LoadRangeAssert(cx: block, PointerVal: ValueRef, lo: c_ulonglong,
540541
hi: c_ulonglong, signed: lib::llvm::Bool) -> ValueRef {
541542
let value = Load(cx, PointerVal);
542543
543-
let ccx = cx.fcx.ccx;
544-
let ty = val_ty(PointerVal);
545544
unsafe {
546-
assert llvm::LLVMGetTypeKind(ty) != lib::llvm::Array;
545+
let t = llvm::LLVMGetElementType(llvm::LLVMTypeOf(PointerVal));
546+
let min = llvm::LLVMConstInt(t, lo, signed);
547+
let max = llvm::LLVMConstInt(t, hi, signed);
547548
548-
let min = llvm::LLVMConstInt(ccx.int_type, lo, signed);
549-
let max = llvm::LLVMConstInt(ccx.int_type, hi, signed);
550549
551550
do vec::as_imm_buf([min, max]) |ptr, len| {
552551
llvm::LLVMSetMetadata(value, lib::llvm::MD_range as c_uint,

src/librustc/middle/trans/datum.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,13 @@ pub impl Datum {
431431
} else {
432432
match self.mode {
433433
ByValue => self.val,
434-
ByRef => Load(bcx, self.val)
434+
ByRef => {
435+
if ty::type_is_bool(self.ty) {
436+
LoadRangeAssert(bcx, self.val, 0, 2, lib::llvm::True)
437+
} else {
438+
Load(bcx, self.val)
439+
}
440+
}
435441
}
436442
}
437443
}

0 commit comments

Comments
 (0)