TMI: More typechecker refactoring
Feb. 25th, 2013 08:12 pmfailures: [run-pass] /Users/tchevalier/rust3/src/test/run-pass/unreachable-code-1.rs [run-pass] /Users/tchevalier/rust3/src/test/run-pass/unreachable-code.rs [run-pass] /Users/tchevalier/rust3/src/test/run-pass/weird-exprs.rs
There was something satisfying about that. Little weird-exprs tests doing their job.
As for why the unreachable-code tests failed: trans (the part of rustc that translates Rust to LLVM) tries to use type information to avoid generating code for unreachable Rust expressions. This is all pretty ad hoc, but since we have the _|_ type in the type system, why not use it?
The expression in this case looks like return + 1. In the old typechecker, if you looked up the type for this instance of 1, it would have been int or uint. But return always returns and arguments to + in Rust are always evaluated left to right, so we know that the 1 is unreachable here. So the new typechecker says 1 has type _|_ in this context.
That caused the code to translate int literals to complain, since it's not expecting an int to have type _|_. Why would anyone write code like this, you ask? They probably wouldn't, but macros could.)
So I'll just make trans more consistent in when it avoids generating code for unreachable expressions. Arguably it might be better to make trans not approximate what code is unreachable and just treat _|_-typed things as if they are reachable and generate code for them, but that's a change for another day.