| //@ check-pass |
| |
| #![feature(rustc_attrs)] |
| #![allow(unused)] |
| |
| use std::borrow::Borrow; |
| use std::ops::Deref; |
| |
| struct PlainType<T>(T); |
| |
| #[derive(Clone)] |
| struct CloneType<T>(T); |
| |
| fn check(mut encoded: &[u8]) { |
| let _ = &mut encoded.clone(); |
| //~^ WARN call to `.clone()` on a reference in this situation does nothing |
| let _ = &encoded.clone(); |
| //~^ WARN call to `.clone()` on a reference in this situation does nothing |
| } |
| |
| fn main() { |
| let non_clone_type_ref = &PlainType(1u32); |
| let non_clone_type_ref_clone: &PlainType<u32> = non_clone_type_ref.clone(); |
| //~^ WARN call to `.clone()` on a reference in this situation does nothing |
| |
| let clone_type_ref = &CloneType(1u32); |
| let clone_type_ref_clone: CloneType<u32> = clone_type_ref.clone(); |
| |
| |
| let non_deref_type = &PlainType(1u32); |
| let non_deref_type_deref: &PlainType<u32> = non_deref_type.deref(); |
| //~^ WARN call to `.deref()` on a reference in this situation does nothing |
| |
| let non_borrow_type = &PlainType(1u32); |
| let non_borrow_type_borrow: &PlainType<u32> = non_borrow_type.borrow(); |
| //~^ WARN call to `.borrow()` on a reference in this situation does nothing |
| |
| // Borrowing a &&T does not warn since it has collapsed the double reference |
| let non_borrow_type = &&PlainType(1u32); |
| let non_borrow_type_borrow: &PlainType<u32> = non_borrow_type.borrow(); |
| } |
| |
| fn generic<T>(non_clone_type: &PlainType<T>) { |
| non_clone_type.clone(); |
| //~^ WARN call to `.clone()` on a reference in this situation does nothing |
| } |
| |
| fn non_generic(non_clone_type: &PlainType<u32>) { |
| non_clone_type.clone(); |
| //~^ WARN call to `.clone()` on a reference in this situation does nothing |
| } |
| |
| struct DiagnosticClone; |
| impl Clone for DiagnosticClone { |
| #[rustc_diagnostic_item = "other_clone"] |
| fn clone(&self) -> Self { |
| DiagnosticClone |
| } |
| } |
| |
| fn with_other_diagnostic_item(x: DiagnosticClone) { |
| x.clone(); |
| } |