Skip to content

Commit 5f536ef

Browse files
committed
Don't truncate discriminants to host uint for C_uint's sake.
1 parent 8ef8dd9 commit 5f536ef

File tree

3 files changed

+13
-9
lines changed

3 files changed

+13
-9
lines changed

src/librustc/middle/trans/adt.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ pub fn trans_get_discr(bcx: @mut Block, r: &Repr, scrutinee: ValueRef)
306306
-> ValueRef {
307307
match *r {
308308
CEnum(min, max) => load_discr(bcx, scrutinee, min, max),
309-
Univariant(*) => C_uint(bcx.ccx(), 0),
309+
Univariant(*) => C_disr(bcx.ccx(), 0),
310310
General(ref cases) => load_discr(bcx, scrutinee, 0, (cases.len() - 1) as Disr),
311311
NullablePointer{ nonnull: ref nonnull, nndiscr, ptrfield, _ } => {
312312
ZExt(bcx, nullable_bitdiscr(bcx, nonnull, nndiscr, ptrfield, scrutinee),
@@ -351,13 +351,13 @@ fn load_discr(bcx: @mut Block, scrutinee: ValueRef, min: Disr, max: Disr)
351351
pub fn trans_case(bcx: @mut Block, r: &Repr, discr: Disr) -> _match::opt_result {
352352
match *r {
353353
CEnum(*) => {
354-
_match::single_result(rslt(bcx, C_uint(bcx.ccx(), discr /*bad*/as uint)))
354+
_match::single_result(rslt(bcx, C_disr(bcx.ccx(), discr)))
355355
}
356356
Univariant(*) => {
357357
bcx.ccx().sess.bug("no cases for univariants or structs")
358358
}
359359
General(*) => {
360-
_match::single_result(rslt(bcx, C_uint(bcx.ccx(), discr /*bad*/as uint)))
360+
_match::single_result(rslt(bcx, C_disr(bcx.ccx(), discr)))
361361
}
362362
NullablePointer{ _ } => {
363363
assert!(discr == 0 || discr == 1);
@@ -375,7 +375,7 @@ pub fn trans_start_init(bcx: @mut Block, r: &Repr, val: ValueRef, discr: Disr) {
375375
match *r {
376376
CEnum(min, max) => {
377377
assert!(min <= discr && discr <= max);
378-
Store(bcx, C_uint(bcx.ccx(), discr/*bad*/ as uint), GEPi(bcx, val, [0, 0]))
378+
Store(bcx, C_disr(bcx.ccx(), discr), GEPi(bcx, val, [0, 0]))
379379
}
380380
Univariant(ref st, true) => {
381381
assert_eq!(discr, 0);
@@ -386,7 +386,7 @@ pub fn trans_start_init(bcx: @mut Block, r: &Repr, val: ValueRef, discr: Disr) {
386386
assert_eq!(discr, 0);
387387
}
388388
General(*) => {
389-
Store(bcx, C_uint(bcx.ccx(), discr/*bad*/ as uint), GEPi(bcx, val, [0, 0]))
389+
Store(bcx, C_disr(bcx.ccx(), discr), GEPi(bcx, val, [0, 0]))
390390
}
391391
NullablePointer{ nonnull: ref nonnull, nndiscr, ptrfield, _ } => {
392392
if discr != nndiscr {
@@ -501,7 +501,7 @@ pub fn trans_const(ccx: &mut CrateContext, r: &Repr, discr: Disr,
501501
CEnum(min, max) => {
502502
assert_eq!(vals.len(), 0);
503503
assert!(min <= discr && discr <= max);
504-
C_uint(ccx, discr/*bad*/ as uint)
504+
C_disr(ccx, discr)
505505
}
506506
Univariant(ref st, _dro) => {
507507
assert_eq!(discr, 0);
@@ -510,7 +510,7 @@ pub fn trans_const(ccx: &mut CrateContext, r: &Repr, discr: Disr,
510510
General(ref cases) => {
511511
let case = &cases[discr];
512512
let max_sz = cases.iter().map(|x| x.size).max().unwrap();
513-
let discr_ty = C_uint(ccx, discr/*bad*/ as uint);
513+
let discr_ty = C_disr(ccx, discr);
514514
let contents = build_const_struct(ccx, case,
515515
~[discr_ty] + vals);
516516
C_struct(contents + &[padding(max_sz - case.size)])
@@ -645,3 +645,7 @@ pub fn is_newtypeish(r: &Repr) -> bool {
645645
_ => false
646646
}
647647
}
648+
649+
fn C_disr(cx: &CrateContext, i: Disr) -> ValueRef {
650+
return C_integral(cx.int_type, i, false);
651+
}

src/librustc/middle/trans/consts.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ fn const_expr_unadjusted(cx: @mut CrateContext, e: &ast::expr) -> ValueRef {
453453
(expr::cast_enum, expr::cast_float) => {
454454
let repr = adt::represent_type(cx, basety);
455455
let discr = adt::const_get_discrim(cx, repr, v);
456-
let iv = C_uint(cx, discr /*bad*/ as uint);
456+
let iv = C_integral(cx.int_type, discr, false);
457457
let ety_cast = expr::cast_type_kind(ety);
458458
match ety_cast {
459459
expr::cast_integral => {

src/librustc/middle/trans/reflect.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ impl Reflector {
317317
for (i, v) in variants.iter().enumerate() {
318318
let name = ccx.sess.str_of(v.name);
319319
let variant_args = ~[this.c_uint(i),
320-
this.c_uint(v.disr_val /*bad*/ as uint),
320+
C_integral(self.bcx.ccx().int_type, v.disr_val, false),
321321
this.c_uint(v.args.len()),
322322
this.c_slice(name)];
323323
do this.bracketed("enum_variant", variant_args) |this| {

0 commit comments

Comments
 (0)