about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tests/ui/option_option.rs25
-rw-r--r--tests/ui/option_option.stderr8
2 files changed, 32 insertions, 1 deletions
diff --git a/tests/ui/option_option.rs b/tests/ui/option_option.rs
index 904c50e1403..a2617a13eca 100644
--- a/tests/ui/option_option.rs
+++ b/tests/ui/option_option.rs
@@ -60,3 +60,28 @@ fn main() {
     // 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)]
+        // FIXME: should not lint here
+        #[allow(clippy::option_option)]
+        foo: Option<Option<Cow<'a, str>>>,
+    }
+
+    #[allow(clippy::option_option)]
+    fn func<'a, D>(_: D) -> Result<Option<Option<Cow<'a, str>>>, D::Error>
+    where
+        D: Deserializer<'a>,
+    {
+        Ok(Some(Some(Cow::Borrowed("hi"))))
+    }
+}
diff --git a/tests/ui/option_option.stderr b/tests/ui/option_option.stderr
index 79db186d7ea..0cd4c96eb4f 100644
--- a/tests/ui/option_option.stderr
+++ b/tests/ui/option_option.stderr
@@ -58,5 +58,11 @@ error: consider using `Option<T>` instead of `Option<Option<T>>` or a custom enu
 LL |     Struct { x: Option<Option<u8>> },
    |                 ^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 9 previous errors
+error: consider using `Option<T>` instead of `Option<Option<T>>` or a custom enum if you need to distinguish all 3 cases
+  --> $DIR/option_option.rs:77:14
+   |
+LL |         foo: Option<Option<Cow<'a, str>>>,
+   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 10 previous errors