The code:
// aux.rs
#[crate_type = "lib"];
pub static Foo: uint = 1;
// main.rs
extern mod aux;
fn main() {
let x = aux::Foo;
match x {
aux::Foo => println("Foo == Foo"),
_ => println("Foo != Foo")
}
}
produces the expected output: Foo == Foo
But after changing aux.rs to
#[crate_type = "lib"];
pub static Foo: uint = 2;
and recompiling only aux.rs, the output is Foo != Foo
This is because rustc is too eager and replaces the match pattern aux::Foo with 1 at compile-time. That works until we change aux::Foo. Because x gets its value at runtime, it becomes 2 and doesn't fit the first match arm.