about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-01-30 21:00:57 -0800
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-01-31 10:08:24 -0800
commitfba35e1a3c87892823d1f4d436b9f00a7864cf16 (patch)
tree1fadaaee99ef266bd2f709fb2aa5577184ab611e /src/libstd
parent813a55d89135efb716dd80e96453a091a7cfc631 (diff)
downloadrust-fba35e1a3c87892823d1f4d436b9f00a7864cf16.tar.gz
rust-fba35e1a3c87892823d1f4d436b9f00a7864cf16.zip
Require alts to be exhaustive
middle::check_alt does the work. Lots of changes to add default cases
into alts that were previously inexhaustive.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/fun_treemap.rs11
-rw-r--r--src/libstd/test.rs6
-rw-r--r--src/libstd/treemap.rs20
-rw-r--r--src/libstd/uvtmp.rs4
4 files changed, 28 insertions, 13 deletions
diff --git a/src/libstd/fun_treemap.rs b/src/libstd/fun_treemap.rs
index a2f6b8c225f..4a98bf5c661 100644
--- a/src/libstd/fun_treemap.rs
+++ b/src/libstd/fun_treemap.rs
@@ -87,12 +87,17 @@ Visit all pairs in the map in order.
 fn traverse<K, V: copy>(m: treemap<K, V>, f: fn(K, V)) {
     alt *m {
       empty { }
-      node(@k, @v, _, _) {
+      /*
+        Previously, this had what looked like redundant
+        matches to me, so I changed it. but that may be a
+        de-optimization -- tjc
+       */
+      node(@k, @v, left, right) {
         // copy v to make aliases work out
         let v1 = v;
-        alt *m { node(_, _, left, _) { traverse(left, f); } }
+        traverse(left, f);
         f(k, v1);
-        alt *m { node(_, _, _, right) { traverse(right, f); } }
+        traverse(right, f);
       }
     }
 }
diff --git a/src/libstd/test.rs b/src/libstd/test.rs
index 707e4cf153f..10b3545fc40 100644
--- a/src/libstd/test.rs
+++ b/src/libstd/test.rs
@@ -398,7 +398,8 @@ mod tests {
     fn first_free_arg_should_be_a_filter() {
         let args = ["progname", "filter"];
         check (vec::is_not_empty(args));
-        let opts = alt parse_opts(args) { either::left(o) { o } };
+        let opts = alt parse_opts(args) { either::left(o) { o }
+          _ { fail "Malformed arg in first_free_arg_should_be_a_filter"; } };
         assert (str::eq("filter", option::get(opts.filter)));
     }
 
@@ -406,7 +407,8 @@ mod tests {
     fn parse_ignored_flag() {
         let args = ["progname", "filter", "--ignored"];
         check (vec::is_not_empty(args));
-        let opts = alt parse_opts(args) { either::left(o) { o } };
+        let opts = alt parse_opts(args) { either::left(o) { o }
+          _ { fail "Malformed arg in parse_ignored_flag"; } };
         assert (opts.run_ignored);
     }
 
diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs
index 4771bc3196b..1c711952e0b 100644
--- a/src/libstd/treemap.rs
+++ b/src/libstd/treemap.rs
@@ -66,14 +66,13 @@ Find a value based on the key
 fn find<K: copy, V: copy>(m: treemap<K, V>, k: K) -> option<V> {
     alt *m {
       empty { none }
-      node(@kk, @v, _, _) {
+      // TODO: was that an optimization?
+      node(@kk, @v, left, right) {
         if k == kk {
             some(v)
         } else if k < kk {
-
-            // Again, ugliness to unpack left and right individually.
-            alt *m { node(_, _, left, _) { find(left, k) } }
-        } else { alt *m { node(_, _, _, right) { find(right, k) } } }
+            find(left, k)
+        } else { find(right, k) }
       }
     }
 }
@@ -86,11 +85,16 @@ Visit all pairs in the map in order.
 fn traverse<K, V>(m: treemap<K, V>, f: fn(K, V)) {
     alt *m {
       empty { }
-      node(k, v, _, _) {
+      /*
+        Previously, this had what looked like redundant
+        matches to me, so I changed it. but that may be a
+        de-optimization -- tjc
+       */
+      node(k, v, left, right) {
         let k1 = k, v1 = v;
-        alt *m { node(_, _, left, _) { traverse(left, f); } }
+        traverse(left, f);
         f(*k1, *v1);
-        alt *m { node(_, _, _, right) { traverse(right, f); } }
+        traverse(right, f);
       }
     }
 }
diff --git a/src/libstd/uvtmp.rs b/src/libstd/uvtmp.rs
index ae08cd5ed5e..36e323e9678 100644
--- a/src/libstd/uvtmp.rs
+++ b/src/libstd/uvtmp.rs
@@ -120,6 +120,7 @@ fn test_connect() {
       connected(cd) {
         close_connection(thread, 0u32);
       }
+      _ { fail "test_connect: port isn't connected"; }
     }
     join_thread(thread);
     delete_thread(thread);
@@ -156,12 +157,15 @@ fn test_http() {
                     }
                     delete_buf(buf);
                   }
+                  _ { fail "test_http: protocol error"; }
                 }
             }
             close_connection(thread, 0u32);
           }
+          _ { fail "test_http: expected `wrote`"; }
         }
       }
+      _ { fail "test_http: port not connected"; }
     }
     join_thread(thread);
     delete_thread(thread);