about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-07-10 17:13:50 -0700
committerbors <bors@rust-lang.org>2013-07-10 17:13:50 -0700
commit9b5d52312622fb301d9e102b3eeca5a7afcdeb9b (patch)
tree7d9825b71eef6c757a3dab37245a42efda89ed82 /src/libstd
parente7040e8a249a8cd53931603b89e0d12b0b854398 (diff)
parent6d4d2c9a33ea0b92e98c22e84e76d3116dcd7444 (diff)
downloadrust-9b5d52312622fb301d9e102b3eeca5a7afcdeb9b.tar.gz
rust-9b5d52312622fb301d9e102b3eeca5a7afcdeb9b.zip
auto merge of #7683 : alexcrichton/rust/issue-7625, r=thestinger
Closes #7625
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/repr.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs
index dd5075f8e66..79d11ddca61 100644
--- a/src/libstd/repr.rs
+++ b/src/libstd/repr.rs
@@ -206,11 +206,13 @@ impl ReprVisitor {
                            inner: *TyDesc)
                            -> bool {
         let mut p = ptr;
-        let end = ptr::offset(p, len);
         let (sz, al) = unsafe { ((*inner).size, (*inner).align) };
         self.writer.write_char('[');
         let mut first = true;
-        while (p as uint) < (end as uint) {
+        let mut left = len;
+        // unit structs have 0 size, and don't loop forever.
+        let dec = if sz == 0 {1} else {sz};
+        while left > 0 {
             if first {
                 first = false;
             } else {
@@ -219,6 +221,7 @@ impl ReprVisitor {
             self.write_mut_qualifier(mtbl);
             self.visit_ptr_inner(p as *c_void, inner);
             p = align(ptr::offset(p, sz) as uint, al) as *u8;
+            left -= dec;
         }
         self.writer.write_char(']');
         true
@@ -635,4 +638,7 @@ fn test_repr() {
                "(10, ~\"hello\")");
     exact_test(&(10_u64, ~"hello"),
                "(10, ~\"hello\")");
+
+    struct Foo;
+    exact_test(&(~[Foo, Foo, Foo]), "~[{}, {}, {}]");
 }