Skip to content

Commit aeb4809

Browse files
Add regression test for #12612
1 parent 8631790 commit aeb4809

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

tests/ui/map_clone.fixed

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,57 @@ fn main() {
156156
let _z = y.map(RcWeak::clone);
157157
}
158158
}
159+
160+
// Ensures that it doesn't suggest `cloned` on `Arc` types.
161+
fn issue_12612() {
162+
use std::sync::Arc;
163+
164+
struct S2(Arc<String>);
165+
struct S1(Option<S2>);
166+
167+
impl S1 {
168+
fn v2(&self) -> Option<Arc<String>> {
169+
self.v1().map(|v1| Arc::clone(&v1.0))
170+
}
171+
172+
fn v3(&self) -> Option<Arc<String>> {
173+
self.v1().map(|v1| {
174+
let x = &v1.0;
175+
Arc::clone(x)
176+
})
177+
}
178+
179+
fn v1(&self) -> Option<&S2> {
180+
match &self.0 {
181+
None => None,
182+
Some(v) => Some(v),
183+
}
184+
}
185+
}
186+
187+
struct D2(String);
188+
struct D1(Option<D2>);
189+
190+
impl D1 {
191+
fn v2(&self) -> Option<String> {
192+
self.v1().map(|v1| String::clone(&v1.0))
193+
}
194+
195+
fn v3(&self) -> Option<String> {
196+
self.v1().map(|v1| {
197+
let x = &v1.0;
198+
String::clone(x)
199+
})
200+
}
201+
202+
fn v1(&self) -> Option<&D2> {
203+
match &self.0 {
204+
None => None,
205+
Some(v) => Some(v),
206+
}
207+
}
208+
}
209+
210+
let x = Some(Arc::new(String::new()));
211+
let y = x.map(|a| Arc::clone(&a));
212+
}

tests/ui/map_clone.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,57 @@ fn main() {
156156
let _z = y.map(RcWeak::clone);
157157
}
158158
}
159+
160+
// Ensures that it doesn't suggest `cloned` on `Arc` types.
161+
fn issue_12612() {
162+
use std::sync::Arc;
163+
164+
struct S2(Arc<String>);
165+
struct S1(Option<S2>);
166+
167+
impl S1 {
168+
fn v2(&self) -> Option<Arc<String>> {
169+
self.v1().map(|v1| Arc::clone(&v1.0))
170+
}
171+
172+
fn v3(&self) -> Option<Arc<String>> {
173+
self.v1().map(|v1| {
174+
let x = &v1.0;
175+
Arc::clone(x)
176+
})
177+
}
178+
179+
fn v1(&self) -> Option<&S2> {
180+
match &self.0 {
181+
None => None,
182+
Some(v) => Some(v),
183+
}
184+
}
185+
}
186+
187+
struct D2(String);
188+
struct D1(Option<D2>);
189+
190+
impl D1 {
191+
fn v2(&self) -> Option<String> {
192+
self.v1().map(|v1| String::clone(&v1.0))
193+
}
194+
195+
fn v3(&self) -> Option<String> {
196+
self.v1().map(|v1| {
197+
let x = &v1.0;
198+
String::clone(x)
199+
})
200+
}
201+
202+
fn v1(&self) -> Option<&D2> {
203+
match &self.0 {
204+
None => None,
205+
Some(v) => Some(v),
206+
}
207+
}
208+
}
209+
210+
let x = Some(Arc::new(String::new()));
211+
let y = x.map(|a| Arc::clone(&a));
212+
}

0 commit comments

Comments
 (0)