//@aux-build:macro_rules.rs #![warn(clippy::missing_panics_doc)] #![allow(clippy::option_map_unit_fn, clippy::unnecessary_literal_unwrap)] #[macro_use] extern crate macro_rules; use macro_rules::macro_with_panic; fn main() {} /// This needs to be documented pub fn unwrap() { //~^ missing_panics_doc let result = Err("Hi"); result.unwrap() } /// This needs to be documented pub fn panic() { //~^ missing_panics_doc panic!("This function panics") } /// This needs to be documented pub fn inner_body(opt: Option) { //~^ missing_panics_doc opt.map(|x| { if x == 10 { panic!() } }); } /// This needs to be documented pub fn unreachable_and_panic() { //~^ missing_panics_doc if true { unreachable!() } else { panic!() } } /// This needs to be documented pub fn assert_eq() { //~^ missing_panics_doc let x = 0; assert_eq!(x, 0); } /// This needs to be documented pub fn assert_ne() { //~^ missing_panics_doc let x = 0; assert_ne!(x, 0); } /// This is documented /// /// # Panics /// /// Panics if `result` if an error pub fn unwrap_documented() { let result = Err("Hi"); result.unwrap() } /// This is documented /// /// # Panics /// /// Panics just because pub fn panic_documented() { panic!("This function panics") } /// This is documented /// /// # Panics /// /// Panics if `opt` is Just(10) pub fn inner_body_documented(opt: Option) { opt.map(|x| { if x == 10 { panic!() } }); } /// This is documented /// /// # Panics /// /// We still need to do this part pub fn unreachable_amd_panic_documented() { if true { unreachable!() } else { panic!() } } /// This is documented /// /// # Panics /// /// Panics if `x` is not 0. pub fn assert_eq_documented() { let x = 0; assert_eq!(x, 0); } /// This is documented /// /// # Panics /// /// Panics if `x` is 0. pub fn assert_ne_documented() { let x = 0; assert_ne!(x, 0); } /// `todo!()` is fine pub fn todo() { todo!() } /// This is okay because it is private fn unwrap_private() { let result = Err("Hi"); result.unwrap() } /// This is okay because it is private fn panic_private() { panic!("This function panics") } /// This is okay because it is private fn inner_body_private(opt: Option) { opt.map(|x| { if x == 10 { panic!() } }); } /// This is okay because unreachable pub fn unreachable() { unreachable!("This function panics") } /// #6970. /// This is okay because it is expansion of `debug_assert` family. pub fn debug_assertions() { debug_assert!(false); debug_assert_eq!(1, 2); debug_assert_ne!(1, 2); } pub fn partially_const(n: usize) { //~^ missing_panics_doc const { assert!(N > 5); } assert!(N > n); } pub fn expect_allow(i: Option) { #[expect(clippy::missing_panics_doc)] i.unwrap(); #[allow(clippy::missing_panics_doc)] i.unwrap(); } pub fn expect_allow_with_error(i: Option) { //~^ missing_panics_doc #[expect(clippy::missing_panics_doc)] i.unwrap(); #[allow(clippy::missing_panics_doc)] i.unwrap(); i.unwrap(); } pub fn expect_after_error(x: Option, y: Option) { //~^ missing_panics_doc let x = x.unwrap(); #[expect(clippy::missing_panics_doc)] let y = y.unwrap(); } // all function must be triggered the lint. // `pub` is required, because the lint does not consider unreachable items pub mod issue10240 { pub fn option_unwrap(v: &[T]) -> &T { //~^ missing_panics_doc let o: Option<&T> = v.last(); o.unwrap() } pub fn option_expect(v: &[T]) -> &T { //~^ missing_panics_doc let o: Option<&T> = v.last(); o.expect("passed an empty thing") } pub fn result_unwrap(v: &[T]) -> &T { //~^ missing_panics_doc let res: Result<&T, &str> = v.last().ok_or("oh noes"); res.unwrap() } pub fn result_expect(v: &[T]) -> &T { //~^ missing_panics_doc let res: Result<&T, &str> = v.last().ok_or("oh noes"); res.expect("passed an empty thing") } pub fn last_unwrap(v: &[u32]) -> u32 { //~^ missing_panics_doc *v.last().unwrap() } pub fn last_expect(v: &[u32]) -> u32 { //~^ missing_panics_doc *v.last().expect("passed an empty thing") } } fn from_external_macro_should_not_lint() { macro_with_panic!() } macro_rules! some_macro_that_panics { () => { panic!() }; } fn from_declared_macro_should_lint_at_macrosite() { // Not here. some_macro_that_panics!() } pub fn issue_12760() { const { if N == 0 { panic!(); } } } /// This needs documenting pub fn unwrap_expect_etc_in_const() { let a = const { std::num::NonZeroUsize::new(1).unwrap() }; // This should still pass the lint even if it is guaranteed to panic at compile-time let b = const { std::num::NonZeroUsize::new(0).unwrap() }; } /// This needs documenting pub const fn unwrap_expect_etc_in_const_fn_fails() { //~^ missing_panics_doc let a = std::num::NonZeroUsize::new(1).unwrap(); } /// This needs documenting pub const fn assert_in_const_fn_fails() { //~^ missing_panics_doc let x = 0; if x == 0 { panic!(); } } /// This needs documenting pub const fn in_const_fn(n: usize) { //~^ missing_panics_doc assert!(N > n); }