about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-10-13 14:45:34 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-10-13 15:14:09 +0200
commite4c91fdf654957cddcbae279d7e113aa4237bb79 (patch)
tree9efc17b3cb8a49e1e08fbf57c558bd4a603bf630 /src/comp
parent6e67c4b2531690bd796b9529af4e90b72faea9d2 (diff)
downloadrust-e4c91fdf654957cddcbae279d7e113aa4237bb79.tar.gz
rust-e4c91fdf654957cddcbae279d7e113aa4237bb79.zip
Properly fill single-variant zero-arg tag values.
Closes #1034. Closes #1035.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs19
1 files changed, 10 insertions, 9 deletions
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);
           }
         }