about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-06-16 11:04:59 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-06-16 11:16:03 -0700
commit4673eb6839852b3902dc6855cce48d195c3b4092 (patch)
treef74d9a7f5c905db3e35cd6cc0c57c24a4c2e2c56 /src/comp
parent741e77174c89723b05eb3dd79c3c47b2d0cd24d8 (diff)
downloadrust-4673eb6839852b3902dc6855cce48d195c3b4092.tar.gz
rust-4673eb6839852b3902dc6855cce48d195c3b4092.zip
rustc: Fix LLVM type error when generating cmp glue for interior vectors
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 35bea36cbc3..a83469e73bc 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2164,10 +2164,26 @@ fn make_cmp_glue(&@block_ctxt cx, ValueRef lhs0, ValueRef rhs0, &ty::t t,
             // If we hit == all the way through the minimum-shared-length
             // section, default to judging the relative sequence lengths.
 
-            r =
-                compare_numerical_values(scx, vec_fill(scx, lhs),
-                                         vec_fill(scx, rhs), unsigned_int,
-                                         llop);
+            auto lhs_fill;
+            auto rhs_fill;
+            auto bcx;
+            if (ty::sequence_is_interior(cx.fcx.lcx.ccx.tcx, t)) {
+                auto lad = ivec::get_len_and_data(scx, lhs,
+                        ty::sequence_element_type(cx.fcx.lcx.ccx.tcx, t));
+                bcx = lad._2;
+                lhs_fill = lad._0;
+                lad = ivec::get_len_and_data(bcx, rhs,
+                        ty::sequence_element_type(cx.fcx.lcx.ccx.tcx, t));
+                bcx = lad._2;
+                rhs_fill = lad._0;
+            } else {
+                lhs_fill = vec_fill(scx, lhs);
+                rhs_fill = vec_fill(scx, rhs);
+                bcx = scx;
+            }
+
+            r = compare_numerical_values(bcx, lhs_fill, rhs_fill,
+                                         unsigned_int, llop);
             r.bcx.build.Store(r.val, flag);
         } else {
             // == and <= default to true if they find == all the way. <