7c4f8cb459
Lots of work on typestate_check, seems to get a lot of the way through checking the standard library. * Added for, for_each, assign_op, bind, cast, put, check, break, and cont. (I'm not sure break and cont are actually handled correctly.) * Fixed side-effect bug in seq_preconds so that unioning the preconditions of a sequence of statements or expressions is handled correctly. * Pass poststate correctly through a stmt_decl. * Handle expr_ret and expr_fail properly (after execution of a ret or fail, everything is true -- this is needed to handle ifs and alts where one branch is a ret or fail) * Fixed bug in set_prestate_ann where a thing that needed to be mutated wasn't getting passed as an alias * Fixed bug in how expr_alt was treated (zero is not the identity for intersect, who knew, right?) * Update logging to reflect log_err vs. log * Fixed find_locals so as to return all local decls and exclude function arguments. * Make union_postconds work on an empty vector (needed to handle empty blocks correctly) * Added _vec.cat_options, which takes a list of option[T] to a list of T, ignoring any Nones * Added two test cases.
21 lines
216 B
Rust
21 lines
216 B
Rust
fn foo[T](&myoption[T] o) -> int {
|
|
let int x;
|
|
|
|
alt (o) {
|
|
case (none[T]) { fail; }
|
|
case (some[T](?t)) {
|
|
x = 5;
|
|
}
|
|
}
|
|
|
|
ret x;
|
|
}
|
|
|
|
tag myoption[T] {
|
|
none;
|
|
some(T);
|
|
}
|
|
|
|
fn main() {
|
|
log(5);
|
|
} |