2019-06-25 01:28:46 +00:00
|
|
|
// run-rustfix
|
2019-10-24 05:52:01 +00:00
|
|
|
// aux-build:macro_rules.rs
|
2019-06-25 01:28:46 +00:00
|
|
|
|
|
|
|
#![deny(clippy::try_err)]
|
|
|
|
|
2019-10-24 05:52:01 +00:00
|
|
|
#[macro_use]
|
|
|
|
extern crate macro_rules;
|
|
|
|
|
2020-08-02 00:00:00 +00:00
|
|
|
use std::io;
|
|
|
|
use std::task::Poll;
|
|
|
|
|
2019-06-25 01:28:46 +00:00
|
|
|
// Tests that a simple case works
|
|
|
|
// Should flag `Err(err)?`
|
|
|
|
pub fn basic_test() -> Result<i32, i32> {
|
|
|
|
let err: i32 = 1;
|
2019-06-30 22:28:12 +00:00
|
|
|
// To avoid warnings during rustfix
|
|
|
|
if true {
|
2019-06-25 01:28:46 +00:00
|
|
|
return Err(err);
|
|
|
|
}
|
|
|
|
Ok(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests that `.into()` is added when appropriate
|
|
|
|
pub fn into_test() -> Result<i32, i32> {
|
|
|
|
let err: u8 = 1;
|
2019-06-30 22:28:12 +00:00
|
|
|
// To avoid warnings during rustfix
|
|
|
|
if true {
|
2019-06-25 01:28:46 +00:00
|
|
|
return Err(err.into());
|
|
|
|
}
|
|
|
|
Ok(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests that tries in general don't trigger the error
|
|
|
|
pub fn negative_test() -> Result<i32, i32> {
|
|
|
|
Ok(nested_error()? + 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests that `.into()` isn't added when the error type
|
|
|
|
// matches the surrounding closure's return type, even
|
|
|
|
// when it doesn't match the surrounding function's.
|
|
|
|
pub fn closure_matches_test() -> Result<i32, i32> {
|
2019-06-30 22:28:12 +00:00
|
|
|
let res: Result<i32, i8> = Some(1)
|
|
|
|
.into_iter()
|
2019-06-25 01:28:46 +00:00
|
|
|
.map(|i| {
|
|
|
|
let err: i8 = 1;
|
2019-06-30 22:28:12 +00:00
|
|
|
// To avoid warnings during rustfix
|
|
|
|
if true {
|
2019-06-25 01:28:46 +00:00
|
|
|
return Err(err);
|
|
|
|
}
|
|
|
|
Ok(i)
|
|
|
|
})
|
|
|
|
.next()
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
Ok(res?)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests that `.into()` isn't added when the error type
|
|
|
|
// doesn't match the surrounding closure's return type.
|
|
|
|
pub fn closure_into_test() -> Result<i32, i32> {
|
2019-06-30 22:28:12 +00:00
|
|
|
let res: Result<i32, i16> = Some(1)
|
|
|
|
.into_iter()
|
2019-06-25 01:28:46 +00:00
|
|
|
.map(|i| {
|
|
|
|
let err: i8 = 1;
|
2019-06-30 22:28:12 +00:00
|
|
|
// To avoid warnings during rustfix
|
|
|
|
if true {
|
2019-06-25 01:28:46 +00:00
|
|
|
return Err(err.into());
|
|
|
|
}
|
|
|
|
Ok(i)
|
|
|
|
})
|
|
|
|
.next()
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
Ok(res?)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn nested_error() -> Result<i32, i32> {
|
|
|
|
Ok(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
basic_test().unwrap();
|
|
|
|
into_test().unwrap();
|
|
|
|
negative_test().unwrap();
|
|
|
|
closure_matches_test().unwrap();
|
|
|
|
closure_into_test().unwrap();
|
2019-10-24 05:52:01 +00:00
|
|
|
|
|
|
|
// We don't want to lint in external macros
|
|
|
|
try_err!();
|
2019-06-25 01:28:46 +00:00
|
|
|
}
|
2019-08-08 12:33:34 +00:00
|
|
|
|
|
|
|
macro_rules! bar {
|
|
|
|
() => {
|
|
|
|
String::from("aasdfasdfasdfa")
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! foo {
|
|
|
|
() => {
|
|
|
|
bar!()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn macro_inside(fail: bool) -> Result<i32, String> {
|
|
|
|
if fail {
|
|
|
|
return Err(foo!());
|
|
|
|
}
|
|
|
|
Ok(0)
|
|
|
|
}
|
2020-08-02 00:00:00 +00:00
|
|
|
|
|
|
|
pub fn poll_write(n: usize) -> Poll<io::Result<usize>> {
|
|
|
|
if n == 0 {
|
|
|
|
return Poll::Ready(Err(io::ErrorKind::WriteZero.into()))
|
|
|
|
} else if n == 1 {
|
|
|
|
return Poll::Ready(Err(io::Error::new(io::ErrorKind::InvalidInput, "error")))
|
|
|
|
};
|
|
|
|
|
|
|
|
Poll::Ready(Ok(n))
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn poll_next(ready: bool) -> Poll<Option<io::Result<()>>> {
|
|
|
|
if !ready {
|
|
|
|
return Poll::Ready(Some(Err(io::ErrorKind::NotFound.into())))
|
|
|
|
}
|
|
|
|
|
|
|
|
Poll::Ready(None)
|
|
|
|
}
|