rust - Can the compiler tell when a `break` is never reached -


i have code:

fn make_guess() -> u32 {     loop {         let mut guess = string::new();         io::stdin().read_line(&mut guess)             .ok()             .expect("failed read line");          match guess.trim().parse() {             ok(num) => return num,             err(_) => {                 println!("please input number!");                 continue;             }         };         break;     } } 

when run code, compiler complains about:

expected `u32`,   found `()` 

seemingly break; results in returning void value. however, there no way break; reached because of return , continue.

in fact, if remove break; works fine.

is bug in compiler or intended reason?

a loop expression doesn't contain break expression evaluates ! (i.e. diverges), compatible types.

fn main() {     let _x: u32 = loop {}; // compiles } 

on other hand, loop break returns (), compatible () type.

fn main() {     let _x: u32 = loop { break; }; // mismatched types: expected `u32`,  found `()` } 

in make_guess function, compiler adds implicit return before loop expression. ! compatible u32, () not. (this implicit return seems occur diverging expressions, if end ;.) adding break statement in loop changes type of loop expression. not matter break unreachable.

heads @ker noticing type of loop changes based on presence or absence of break expression in body.


Comments

Popular posts from this blog

java - Static nested class instance -

c# - Bluetooth LE CanUpdate Characteristic property -

JavaScript - Replace variable from string in all occurrences -