diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2012-02-15 09:40:42 +0100 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2012-02-15 15:47:42 +0100 |
| commit | 67cc89f38d2e75cb0dcd6303fbe4bb4f659277a7 (patch) | |
| tree | 99caacd6c05c72beb28e73a9aa759b5db1d88114 /src/libstd | |
| parent | 4b63826050dfc579b9ac65a6b72ad0ca6f6b51fc (diff) | |
| download | rust-67cc89f38d2e75cb0dcd6303fbe4bb4f659277a7.tar.gz rust-67cc89f38d2e75cb0dcd6303fbe4bb4f659277a7.zip | |
Rewrite exhaustiveness checker
Issue #352
Closes #1720
The old checker would happily accept things like 'alt x { @some(a) { a } }'.
It now properly descends into patterns, checks exhaustiveness of booleans,
and complains when number/string patterns aren't exhaustive.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/four.rs | 6 | ||||
| -rw-r--r-- | src/libstd/serialization.rs | 2 | ||||
| -rw-r--r-- | src/libstd/treemap.rs | 8 | ||||
| -rw-r--r-- | src/libstd/tri.rs | 4 |
4 files changed, 12 insertions, 8 deletions
diff --git a/src/libstd/four.rs b/src/libstd/four.rs index ad44f225f25..e1804be2b91 100644 --- a/src/libstd/four.rs +++ b/src/libstd/four.rs @@ -166,7 +166,7 @@ Function: from_str Parse logic value from `s` */ pure fn from_str(s: str) -> t { - alt s { + alt check s { "none" { none } "false" { four::false } "true" { four::true } @@ -181,7 +181,7 @@ Convert `v` into a string */ pure fn to_str(v: t) -> str { // FIXME replace with consts as soon as that works - alt v { + alt check v { 0u8 { "none" } 1u8 { "true" } 2u8 { "false" } @@ -265,7 +265,7 @@ mod tests { } fn to_tup(v: four::t) -> (bool, bool) { - alt v { + alt check v { 0u8 { (false, false) } 1u8 { (false, true) } 2u8 { (true, false) } diff --git a/src/libstd/serialization.rs b/src/libstd/serialization.rs index 1b91b34fe11..1cc8cb529d8 100644 --- a/src/libstd/serialization.rs +++ b/src/libstd/serialization.rs @@ -241,7 +241,7 @@ fn test_option_int() { fn deserialize_0<S: deserializer>(s: S) -> option<int> { s.read_enum("option") {|| s.read_enum_variant {|i| - alt i { + alt check i { 0u { none } 1u { let v0 = s.read_enum_variant_arg(0u) {|| diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index bcea14df377..1647ea8f977 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -52,8 +52,12 @@ fn insert<K: copy, V: copy>(m: treemap<K, V>, k: K, v: V) { // We have to name left and right individually, because // otherwise the alias checker complains. if k < kk { - alt m { @node(_, _, left, _) { insert(left, k, v); } } - } else { alt m { @node(_, _, _, right) { insert(right, k, v); } } } + alt check m { @node(_, _, left, _) { insert(left, k, v); } } + } else { + alt check m { + @node(_, _, _, right) { insert(right, k, v); } + } + } } } } diff --git a/src/libstd/tri.rs b/src/libstd/tri.rs index 7cc749429ce..5835dbf8c42 100644 --- a/src/libstd/tri.rs +++ b/src/libstd/tri.rs @@ -137,7 +137,7 @@ Function: from_str Parse logic value from `s` */ pure fn from_str(s: str) -> t { - alt s { + alt check s { "unknown" { unknown } "true" { tri::true } "false" { tri::false } @@ -151,7 +151,7 @@ Convert `v` into a string */ pure fn to_str(v: t) -> str { // FIXME replace with consts as soon as that works - alt v { + alt check v { 0u8 { "unknown" } 1u8 { "true" } 2u8 { "false" } |
