I hope it is not very surprising that calling `example` on, e.g., `3` transmuted to `bool` is Undefined Behavior (UB).
When compiling `if`, the compiler assumes that `0` and `1` are the only possible values; there is no saying what could go wrong when that assumption is violated.
+(This is a compiler-understood *validity invariant* that is fixed in the language specification, which is very different from a user-defined *safety invariant*.
+See [this earlier post]({% post_url 2018-08-22-two-kinds-of-invariants %}) for more details on that distinction.)
What is less obvious is why calling `example` on `3` is UB even when there is no such `if` being executed.
To understand why that is important, let us consider the following example:
{% highlight rust %}
fn example(b: bool, num: u32) -> i32 {
let mut acc = 0;
- let incr = if b { 42 } else { 23 }
+ let incr = if b { 42 } else { 23 };
for _i in 0..num {
acc += incr;
}