From e4c91fdf654957cddcbae279d7e113aa4237bb79 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Thu, 13 Oct 2011 14:45:34 +0200 Subject: [PATCH] Properly fill single-variant zero-arg tag values. Closes #1034. Closes #1035. --- src/comp/middle/trans.rs | 19 ++++++++++--------- src/test/run-pass/empty-tag.rs | 10 ++++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 src/test/run-pass/empty-tag.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index ded401ae796..944dfa91a96 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -251,13 +251,13 @@ fn type_of_tag(cx: @crate_ctxt, sp: span, did: ast::def_id, t: ty::t) let degen = std::vec::len(ty::tag_variants(cx.tcx, did)) == 1u; if check type_has_static_size(cx, t) { let size = static_size_of_tag(cx, sp, t); - if !degen { ret T_tag(cx.tn, size); } - // LLVM does not like 0-size arrays, apparently - if size == 0u { size = 1u; } - ret T_array(T_i8(), size); + if !degen { T_tag(cx.tn, size) } + else if size == 0u { T_struct([T_int()]) } + else { T_array(T_i8(), size) } } else { - if degen { ret T_i8(); } else { ret T_opaque_tag(cx.tn); } + if degen { T_struct([T_int()]) } + else { T_opaque_tag(cx.tn) } } } @@ -3115,12 +3115,13 @@ fn trans_var(cx: @block_ctxt, sp: span, def: ast::def, id: ast::node_id) let lltagty = type_of_tag(ccx, sp, tid, tag_ty); let bcx = alloc_result.bcx; let lltagptr = PointerCast(bcx, lltagblob, T_ptr(lltagty)); - if std::vec::len(ty::tag_variants(ccx.tcx, tid)) != 1u { + let lldiscrimptr = GEP(bcx, lltagptr, [C_int(0), C_int(0)]); + let d = if std::vec::len(ty::tag_variants(ccx.tcx, tid)) != 1u { let lldiscrim_gv = lookup_discriminant(bcx.fcx.lcx, vid); let lldiscrim = Load(bcx, lldiscrim_gv); - let lldiscrimptr = GEP(bcx, lltagptr, [C_int(0), C_int(0)]); - Store(bcx, lldiscrim, lldiscrimptr); - } + lldiscrim + } else { C_int(0) }; + Store(bcx, d, lldiscrimptr); ret lval_no_env(bcx, lltagptr, temporary); } } diff --git a/src/test/run-pass/empty-tag.rs b/src/test/run-pass/empty-tag.rs new file mode 100644 index 00000000000..d9563dd74c4 --- /dev/null +++ b/src/test/run-pass/empty-tag.rs @@ -0,0 +1,10 @@ +tag chan { chan_t; } + +fn wrapper3(i: chan) { + assert i == chan_t; +} + +fn main() { + let wrapped = bind wrapper3(chan_t); + wrapped(); +}