diff --git a/tests/ui/map_clone.fixed b/tests/ui/map_clone.fixed index f9f8dc1a5123..79e9d825359b 100644 --- a/tests/ui/map_clone.fixed +++ b/tests/ui/map_clone.fixed @@ -156,3 +156,57 @@ fn main() { let _z = y.map(RcWeak::clone); } } + +// Ensures that it doesn't suggest `cloned` on `Arc` types. +fn issue_12612() { + use std::sync::Arc; + + struct S2(Arc); + struct S1(Option); + + impl S1 { + fn v2(&self) -> Option> { + self.v1().map(|v1| Arc::clone(&v1.0)) + } + + fn v3(&self) -> Option> { + self.v1().map(|v1| { + let x = &v1.0; + Arc::clone(x) + }) + } + + fn v1(&self) -> Option<&S2> { + match &self.0 { + None => None, + Some(v) => Some(v), + } + } + } + + struct D2(String); + struct D1(Option); + + impl D1 { + fn v2(&self) -> Option { + self.v1().map(|v1| String::clone(&v1.0)) + } + + fn v3(&self) -> Option { + self.v1().map(|v1| { + let x = &v1.0; + String::clone(x) + }) + } + + fn v1(&self) -> Option<&D2> { + match &self.0 { + None => None, + Some(v) => Some(v), + } + } + } + + let x = Some(Arc::new(String::new())); + let y = x.map(|a| Arc::clone(&a)); +} diff --git a/tests/ui/map_clone.rs b/tests/ui/map_clone.rs index a5c19ce06319..bf4dceda26d7 100644 --- a/tests/ui/map_clone.rs +++ b/tests/ui/map_clone.rs @@ -156,3 +156,57 @@ fn main() { let _z = y.map(RcWeak::clone); } } + +// Ensures that it doesn't suggest `cloned` on `Arc` types. +fn issue_12612() { + use std::sync::Arc; + + struct S2(Arc); + struct S1(Option); + + impl S1 { + fn v2(&self) -> Option> { + self.v1().map(|v1| Arc::clone(&v1.0)) + } + + fn v3(&self) -> Option> { + self.v1().map(|v1| { + let x = &v1.0; + Arc::clone(x) + }) + } + + fn v1(&self) -> Option<&S2> { + match &self.0 { + None => None, + Some(v) => Some(v), + } + } + } + + struct D2(String); + struct D1(Option); + + impl D1 { + fn v2(&self) -> Option { + self.v1().map(|v1| String::clone(&v1.0)) + } + + fn v3(&self) -> Option { + self.v1().map(|v1| { + let x = &v1.0; + String::clone(x) + }) + } + + fn v1(&self) -> Option<&D2> { + match &self.0 { + None => None, + Some(v) => Some(v), + } + } + } + + let x = Some(Arc::new(String::new())); + let y = x.map(|a| Arc::clone(&a)); +}