From 971b5d5151f79582252fa1281edb09cf86fd63ff Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Sat, 14 May 2011 19:02:30 -0700 Subject: Started adding support for return checking and non-returning function annotations * Reorganized typestate into several modules. * Made typestate check that any function with a non-nil return type returns a value. For now, the check is a warning and not an error (see next item). * Added a "bot" type (prettyprinted as _|_), for constructs like be, ret, break, cont, and fail that don't locally return a value that can be inspected. "bot" is distinct from "nil". There is no concrete syntax for _|_, while the concrete syntax for the nil type is (). * Added support to the parser for a ! annotation on functions whose result type is _|_. Such a function is required to have either a fail or a call to another ! function that is reached in all control flow paths. The point of this annotation is to mark functions like unimpl() and span_err(), so that an alt with a call to err() in one case isn't a false positive for the return-value checker. I haven't actually annotated anything with it yet. * Random bugfixes: * * Fixed bug in trans::trans_binary that was throwing away the cleanups for nested subexpressions of an and or or (tests: box-inside-if and box-inside-if2). ** In typeck, unify the expected type arguments of a tag with the actual specified arguments. --- src/comp/driver/rustc.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/comp/driver') diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs index d538e1711a6..d9d5633d05d 100644 --- a/src/comp/driver/rustc.rs +++ b/src/comp/driver/rustc.rs @@ -9,7 +9,7 @@ import middle::trans; import middle::resolve; import middle::ty; import middle::typeck; -import middle::typestate_check; +import middle::tstate::ck; import back::link; import lib::llvm; import util::common; @@ -105,7 +105,8 @@ fn compile_input(session::session sess, if (sess.get_opts().run_typestate) { crate = time(time_passes, "typestate checking", - bind typestate_check::check_crate(crate, def_map)); + bind middle::tstate::ck::check_crate(node_type_table, + ty_cx, crate)); } auto llmod = time[llvm::ModuleRef](time_passes, "translation", -- cgit 1.4.1-3-g733a5