#![deny(clippy::option_option)] #![allow(clippy::unnecessary_wrap)] fn input(_: Option>) {} fn output() -> Option> { None } fn output_nested() -> Vec>> { vec![None] } // The lint only generates one warning for this fn output_nested_nested() -> Option>> { None } struct Struct { x: Option>, } impl Struct { fn struct_fn() -> Option> { None } } trait Trait { fn trait_fn() -> Option>; } enum Enum { Tuple(Option>), Struct { x: Option> }, } // The lint allows this type OptionOption = Option>; // The lint allows this fn output_type_alias() -> OptionOption { None } // The line allows this impl Trait for Struct { fn trait_fn() -> Option> { None } } fn main() { input(None); output(); output_nested(); // The lint allows this let local: Option> = None; // The lint allows this let expr = Some(Some(true)); } extern crate serde; mod issue_4298 { use serde::{Deserialize, Deserializer, Serialize}; use std::borrow::Cow; #[derive(Serialize, Deserialize)] struct Foo<'a> { #[serde(deserialize_with = "func")] #[serde(skip_serializing_if = "Option::is_none")] #[serde(default)] #[serde(borrow)] foo: Option>>, } #[allow(clippy::option_option)] fn func<'a, D>(_: D) -> Result>>, D::Error> where D: Deserializer<'a>, { Ok(Some(Some(Cow::Borrowed("hi")))) } }