diff options
| author | Roy Frostig <[email protected]> | 2010-08-12 16:21:08 -0700 |
|---|---|---|
| committer | Roy Frostig <[email protected]> | 2010-08-12 16:21:08 -0700 |
| commit | 4e376852e709844d67f94430d9dc954d5be722b4 (patch) | |
| tree | fb23b6a4ffc16914b89ab161ad4ace54c1a2b7ff /src | |
| parent | Address FIXME in _vec waiting on closed issue #108. (diff) | |
| download | rust-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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 1 | ||||
| -rw-r--r-- | src/boot/util/common.ml | 2 | ||||
| -rw-r--r-- | src/test/run-pass/size-and-align.rs | 18 |
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); +} |