blob: 3381fffb6e450d186a4ba137c9d1b5019b649b4d [file] [log] [blame]
//@aux-build: proc_macros.rs
#![warn(clippy::implicit_return)]
#![allow(clippy::needless_return, clippy::needless_bool, unused, clippy::never_loop)]
extern crate proc_macros;
use proc_macros::with_span;
fn test_end_of_fn() -> bool {
if true {
// no error!
return true;
}
true
//~^ implicit_return
}
fn test_if_block() -> bool {
if true { true } else { false }
//~^ implicit_return
//~| implicit_return
}
#[rustfmt::skip]
fn test_match(x: bool) -> bool {
match x {
true => false,
//~^ implicit_return
false => { true },
//~^ implicit_return
}
}
fn test_match_with_unreachable(x: bool) -> bool {
match x {
true => return false,
false => unreachable!(),
}
}
fn test_loop() -> bool {
loop {
break true;
//~^ implicit_return
}
}
fn test_loop_with_block() -> bool {
loop {
{
break true;
//~^ implicit_return
}
}
}
fn test_loop_with_nests() -> bool {
loop {
if true {
break true;
//~^ implicit_return
} else {
let _ = true;
}
}
}
#[allow(clippy::redundant_pattern_matching)]
fn test_loop_with_if_let() -> bool {
loop {
if let Some(x) = Some(true) {
return x;
}
}
}
fn test_closure() {
#[rustfmt::skip]
let _ = || { true };
//~^ implicit_return
let _ = || true;
//~^ implicit_return
}
fn test_panic() -> bool {
panic!()
}
fn test_return_macro() -> String {
format!("test {}", "test")
//~^ implicit_return
}
fn macro_branch_test() -> bool {
macro_rules! m {
($t:expr, $f:expr) => {
if true { $t } else { $f }
};
}
m!(true, false)
//~^ implicit_return
}
fn loop_test() -> bool {
'outer: loop {
if true {
break true;
//~^ implicit_return
}
let _ = loop {
if false {
break 'outer false;
//~^ implicit_return
}
if true {
break true;
}
};
}
}
fn loop_macro_test() -> bool {
macro_rules! m {
($e:expr) => {
break $e
};
}
loop {
m!(true);
}
}
//~^^^^ implicit_return
fn divergent_test() -> bool {
fn diverge() -> ! {
panic!()
}
diverge()
}
// issue #6940
async fn foo() -> bool {
true
//~^ implicit_return
}
fn main() {}
fn check_expect() -> bool {
if true {
// no error!
return true;
}
#[expect(clippy::implicit_return)]
true
}
with_span!(
span
fn dont_lint_proc_macro(x: usize) -> usize{
x
}
);
fn desugared_closure_14446() {
let _ = async || 0;
//~^ implicit_return
#[rustfmt::skip]
let _ = async || -> i32 { 0 };
//~^ implicit_return
let _ = async |a: i32| a;
//~^ implicit_return
#[rustfmt::skip]
let _ = async |a: i32| { a };
//~^ implicit_return
let _ = async || return 0;
let _ = async || -> i32 { return 0 };
let _ = async |a: i32| return a;
#[rustfmt::skip]
let _ = async |a: i32| { return a; };
let _ = async || foo().await;
//~^ implicit_return
let _ = async || {
foo().await;
foo().await
};
//~^^ implicit_return
#[rustfmt::skip]
let _ = async || { foo().await };
//~^ implicit_return
let _ = async || -> bool { foo().await };
//~^ implicit_return
let _ = async || return foo().await;
let _ = async || {
foo().await;
return foo().await;
};
#[rustfmt::skip]
let _ = async || { return foo().await; };
let _ = async || -> bool {
return foo().await;
};
}