Don't loop infinitely on 0-size structs in repr

Closes #7625
This commit is contained in:
Alex Crichton 2013-07-10 00:01:58 -07:00
parent e388a80c23
commit 6d4d2c9a33
1 changed files with 8 additions and 2 deletions

View File

@ -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]), "~[{}, {}, {}]");
}