Skip to content

Commit e4c91fd

Browse files
committed
Properly fill single-variant zero-arg tag values.
Closes #1034. Closes #1035.
1 parent 6e67c4b commit e4c91fd

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

src/comp/middle/trans.rs

+10-9
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,13 @@ fn type_of_tag(cx: @crate_ctxt, sp: span, did: ast::def_id, t: ty::t)
251251
let degen = std::vec::len(ty::tag_variants(cx.tcx, did)) == 1u;
252252
if check type_has_static_size(cx, t) {
253253
let size = static_size_of_tag(cx, sp, t);
254-
if !degen { ret T_tag(cx.tn, size); }
255-
// LLVM does not like 0-size arrays, apparently
256-
if size == 0u { size = 1u; }
257-
ret T_array(T_i8(), size);
254+
if !degen { T_tag(cx.tn, size) }
255+
else if size == 0u { T_struct([T_int()]) }
256+
else { T_array(T_i8(), size) }
258257
}
259258
else {
260-
if degen { ret T_i8(); } else { ret T_opaque_tag(cx.tn); }
259+
if degen { T_struct([T_int()]) }
260+
else { T_opaque_tag(cx.tn) }
261261
}
262262
}
263263

@@ -3115,12 +3115,13 @@ fn trans_var(cx: @block_ctxt, sp: span, def: ast::def, id: ast::node_id)
31153115
let lltagty = type_of_tag(ccx, sp, tid, tag_ty);
31163116
let bcx = alloc_result.bcx;
31173117
let lltagptr = PointerCast(bcx, lltagblob, T_ptr(lltagty));
3118-
if std::vec::len(ty::tag_variants(ccx.tcx, tid)) != 1u {
3118+
let lldiscrimptr = GEP(bcx, lltagptr, [C_int(0), C_int(0)]);
3119+
let d = if std::vec::len(ty::tag_variants(ccx.tcx, tid)) != 1u {
31193120
let lldiscrim_gv = lookup_discriminant(bcx.fcx.lcx, vid);
31203121
let lldiscrim = Load(bcx, lldiscrim_gv);
3121-
let lldiscrimptr = GEP(bcx, lltagptr, [C_int(0), C_int(0)]);
3122-
Store(bcx, lldiscrim, lldiscrimptr);
3123-
}
3122+
lldiscrim
3123+
} else { C_int(0) };
3124+
Store(bcx, d, lldiscrimptr);
31243125
ret lval_no_env(bcx, lltagptr, temporary);
31253126
}
31263127
}

src/test/run-pass/empty-tag.rs

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
tag chan { chan_t; }
2+
3+
fn wrapper3(i: chan) {
4+
assert i == chan_t;
5+
}
6+
7+
fn main() {
8+
let wrapped = bind wrapper3(chan_t);
9+
wrapped();
10+
}

0 commit comments

Comments
 (0)