aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Frostig <[email protected]>2010-08-12 16:21:08 -0700
committerRoy Frostig <[email protected]>2010-08-12 16:21:08 -0700
commit4e376852e709844d67f94430d9dc954d5be722b4 (patch)
treefb23b6a4ffc16914b89ab161ad4ace54c1a2b7ff
parentAddress FIXME in _vec waiting on closed issue #108. (diff)
downloadrust-4e376852e709844d67f94430d9dc954d5be722b4.tar.xz
rust-4e376852e709844d67f94430d9dc954d5be722b4.zip
Fix max_sz bug that ended up causing us to index incorrectly into a vec of tag types. Add a testcase.
-rw-r--r--src/Makefile1
-rw-r--r--src/boot/util/common.ml2
-rw-r--r--src/test/run-pass/size-and-align.rs18
3 files changed, 20 insertions, 1 deletions
diff --git a/src/Makefile b/src/Makefile
index c10088ea..49c53331 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -507,6 +507,7 @@ TEST_XFAILS_LLVM := $(TASK_XFAILS) \
rec-tup.rs \
rec.rs \
simple-obj.rs \
+ size-and-align.rs \
spawn-fn.rs \
spawn-module-qualified.rs \
spawn.rs \
diff --git a/src/boot/util/common.ml b/src/boot/util/common.ml
index 58caf78d..7b0f7848 100644
--- a/src/boot/util/common.ml
+++ b/src/boot/util/common.ml
@@ -686,7 +686,7 @@ let rec max_sz (a:size) (b:size) : size =
| (SIZE_rt_max (b, c), a) when a = c -> max_sz a b
| (SIZE_fixed a, SIZE_fixed b) -> SIZE_fixed (i64_max a b)
| (SIZE_fixed 0L, b) when no_negs b -> b
- | (a, SIZE_fixed 0L) when no_negs a -> b
+ | (a, SIZE_fixed 0L) when no_negs a -> a
| (a, SIZE_fixed b) -> max_sz (SIZE_fixed b) a
| (a, b) when a = b -> a
| (a, b) -> SIZE_rt_max (a, b)
diff --git a/src/test/run-pass/size-and-align.rs b/src/test/run-pass/size-and-align.rs
new file mode 100644
index 00000000..94fa3bc1
--- /dev/null
+++ b/src/test/run-pass/size-and-align.rs
@@ -0,0 +1,18 @@
+// -*- rust -*-
+
+use std;
+import std._vec;
+
+type clam[T] = tag(a(T, int), b());
+
+fn uhoh[T](vec[clam[T]] v) {
+ alt (v.(1)) {
+ case (a[T](t, u)) { log "incorrect"; log u; fail; }
+ case (b[T]()) { log "correct"; }
+ }
+}
+
+fn main() {
+ let vec[clam[int]] v = vec(b[int](), b[int](), a[int](42, 17));
+ uhoh[int](v);
+}