81 lines
2.2 KiB
Rust
81 lines
2.2 KiB
Rust
#![warn(clippy::clone_on_ref_ptr)]
|
|
|
|
use std::rc::{Rc, Weak as RcWeak};
|
|
use std::sync::{Arc, Weak as ArcWeak};
|
|
|
|
fn main() {}
|
|
|
|
fn clone_on_ref_ptr(rc: Rc<str>, rc_weak: RcWeak<str>, arc: Arc<str>, arc_weak: ArcWeak<str>) {
|
|
std::rc::Rc::<str>::clone(&rc);
|
|
//~^ clone_on_ref_ptr
|
|
std::rc::Weak::<str>::clone(&rc_weak);
|
|
//~^ clone_on_ref_ptr
|
|
std::sync::Arc::<str>::clone(&arc);
|
|
//~^ clone_on_ref_ptr
|
|
std::sync::Weak::<str>::clone(&arc_weak);
|
|
//~^ clone_on_ref_ptr
|
|
|
|
Rc::clone(&rc);
|
|
Arc::clone(&arc);
|
|
RcWeak::clone(&rc_weak);
|
|
ArcWeak::clone(&arc_weak);
|
|
}
|
|
|
|
trait SomeTrait {}
|
|
struct SomeImpl;
|
|
impl SomeTrait for SomeImpl {}
|
|
|
|
fn trait_object() {
|
|
let x = Arc::new(SomeImpl);
|
|
let _: Arc<dyn SomeTrait> = std::sync::Arc::<SomeImpl>::clone(&x);
|
|
//~^ clone_on_ref_ptr
|
|
}
|
|
|
|
mod issue2076 {
|
|
use std::rc::Rc;
|
|
|
|
macro_rules! try_opt {
|
|
($expr: expr) => {
|
|
match $expr {
|
|
Some(value) => value,
|
|
None => return None,
|
|
}
|
|
};
|
|
}
|
|
|
|
fn func() -> Option<Rc<u8>> {
|
|
let rc = Rc::new(42);
|
|
Some(std::rc::Rc::<u8>::clone(&try_opt!(Some(rc))))
|
|
//~^ clone_on_ref_ptr
|
|
}
|
|
}
|
|
|
|
#[allow(
|
|
clippy::needless_borrow,
|
|
reason = "the suggestion creates `Weak::clone(&rec)`, but `rec` is already a reference"
|
|
)]
|
|
mod issue15009 {
|
|
use std::rc::{Rc, Weak};
|
|
use std::sync::atomic::{AtomicU32, Ordering};
|
|
|
|
fn main() {
|
|
let counter = AtomicU32::new(0);
|
|
let counter_ref = &counter;
|
|
let factorial = Rc::new_cyclic(move |rec| {
|
|
let rec = std::rc::Weak::</* generic */>::clone(&rec) as Weak<dyn Fn(u32) -> u32>;
|
|
//~^ clone_on_ref_ptr
|
|
move |x| {
|
|
// can capture env
|
|
counter_ref.fetch_add(1, Ordering::Relaxed);
|
|
match x {
|
|
0 => 1,
|
|
x => x * rec.upgrade().unwrap()(x - 1),
|
|
}
|
|
}
|
|
});
|
|
println!("{}", factorial(5)); // 120
|
|
println!("{}", counter.load(Ordering::Relaxed)); // 6
|
|
println!("{}", factorial(7)); // 5040
|
|
println!("{}", counter.load(Ordering::Relaxed)); // 14
|
|
}
|
|
}
|