Open
Description
Consider following snippet:
use std::error::Error;
use std::io::{self, ErrorKind};
fn caused_of<'a>(mut err: &'a (Error + 'static)) -> Option<&'a io::Error> {
loop {
match err.downcast_ref::<io::Error>() {
None => match err.cause() {
None => return None,
Some(cause) => err = cause,
},
d => return d,
}
}
}
fn main() {
let e = io::Error::new(ErrorKind::Other, "oh no!");
println!("{:?}", caused_of(&e));
}
According to Book, cause's lifetime should be err's lifetime. which is 'a, so it should be safe to assign cause to err directly. But I got following warnnings:
test.rs:8:34: 8:39 error: cannot infer an appropriate lifetime for autoref due to conflicting requirements [E0495]
test.rs:8 None => match err.cause() {
^~~~~
test.rs:8:30: 8:41 note: first, the lifetime cannot outlive the method call at 8:29...
test.rs:8 None => match err.cause() {
^~~~~~~~~~~
test.rs:8:30: 8:33 note: ...so that method receiver is valid for the method call
test.rs:8 None => match err.cause() {
^~~
test.rs:5:75: 15:25 note: but, the lifetime must be valid for the lifetime 'a as defined on the block at 5:74...
test.rs:5 fn caused_of<'a>(mut err: &'a (Error + 'static)) -> Option<&'a io::Error> {
^
test.rs:10:48: 10:53 note: ...so that trait type parameters matches those specified on the impl (expected std::ops::CoerceUnsized<&'a std::error::Error + 'static>, found std::ops::CoerceUnsized<&std::error::Error + 'static>)
test.rs:10 Some(cause) => err = cause,
^~~~~
error: aborting due to previous error
Am I missing something here?