fix: add test case, use a better conditional expression.
This commit is contained in:
parent
c53cea90ad
commit
1038927b47
@ -1,10 +1,11 @@
|
|||||||
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then};
|
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then};
|
||||||
use clippy_utils::ty::implements_trait;
|
use clippy_utils::ty::implements_trait;
|
||||||
use clippy_utils::{is_res_lang_ctor, last_path_segment, path_res, std_or_core};
|
use clippy_utils::{is_from_proc_macro, is_res_lang_ctor, last_path_segment, path_res, std_or_core};
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
use rustc_hir::{Expr, ExprKind, ImplItem, ImplItemKind, LangItem, Node, UnOp};
|
use rustc_hir::{Expr, ExprKind, ImplItem, ImplItemKind, LangItem, Node, UnOp};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass, LintContext};
|
||||||
|
use rustc_middle::lint::in_external_macro;
|
||||||
use rustc_middle::ty::EarlyBinder;
|
use rustc_middle::ty::EarlyBinder;
|
||||||
use rustc_session::declare_lint_pass;
|
use rustc_session::declare_lint_pass;
|
||||||
use rustc_span::sym;
|
use rustc_span::sym;
|
||||||
@ -111,7 +112,7 @@
|
|||||||
|
|
||||||
impl LateLintPass<'_> for NonCanonicalImpls {
|
impl LateLintPass<'_> for NonCanonicalImpls {
|
||||||
#[expect(clippy::too_many_lines)]
|
#[expect(clippy::too_many_lines)]
|
||||||
fn check_impl_item(&mut self, cx: &LateContext<'_>, impl_item: &ImplItem<'_>) {
|
fn check_impl_item<'tcx>(&mut self, cx: &LateContext<'tcx>, impl_item: &ImplItem<'tcx>) {
|
||||||
let Node::Item(item) = cx.tcx.parent_hir_node(impl_item.hir_id()) else {
|
let Node::Item(item) = cx.tcx.parent_hir_node(impl_item.hir_id()) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
@ -128,9 +129,7 @@ fn check_impl_item(&mut self, cx: &LateContext<'_>, impl_item: &ImplItem<'_>) {
|
|||||||
let ExprKind::Block(block, ..) = body.value.kind else {
|
let ExprKind::Block(block, ..) = body.value.kind else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
if let Some(expr) = block.expr
|
if in_external_macro(cx.sess(), block.span) || is_from_proc_macro(cx, impl_item) {
|
||||||
&& expr.span.from_expansion()
|
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,8 +176,7 @@ pub fn non_canonical_clone_derive(_: TokenStream) -> TokenStream {
|
|||||||
struct NonCanonicalClone;
|
struct NonCanonicalClone;
|
||||||
impl Clone for NonCanonicalClone {
|
impl Clone for NonCanonicalClone {
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
let a = *self;
|
todo!()
|
||||||
a
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl Copy for NonCanonicalClone {}
|
impl Copy for NonCanonicalClone {}
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
#![allow(clippy::assigning_clones)]
|
#![allow(clippy::assigning_clones)]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
extern crate proc_macros;
|
||||||
|
use proc_macros::with_span;
|
||||||
|
|
||||||
// lint
|
// lint
|
||||||
|
|
||||||
struct A(u32);
|
struct A(u32);
|
||||||
@ -100,3 +103,15 @@ impl<A: std::fmt::Debug + Copy + Clone> Copy for Uwu<A> {}
|
|||||||
// should skip proc macros, see https://github.com/rust-lang/rust-clippy/issues/12788
|
// should skip proc macros, see https://github.com/rust-lang/rust-clippy/issues/12788
|
||||||
#[derive(proc_macro_derive::NonCanonicalClone)]
|
#[derive(proc_macro_derive::NonCanonicalClone)]
|
||||||
pub struct G;
|
pub struct G;
|
||||||
|
|
||||||
|
with_span!(
|
||||||
|
span
|
||||||
|
|
||||||
|
#[derive(Copy)]
|
||||||
|
struct H;
|
||||||
|
impl Clone for H {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
#![allow(clippy::assigning_clones)]
|
#![allow(clippy::assigning_clones)]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
extern crate proc_macros;
|
||||||
|
use proc_macros::with_span;
|
||||||
|
|
||||||
// lint
|
// lint
|
||||||
|
|
||||||
struct A(u32);
|
struct A(u32);
|
||||||
@ -110,3 +113,15 @@ impl<A: std::fmt::Debug + Copy + Clone> Copy for Uwu<A> {}
|
|||||||
// should skip proc macros, see https://github.com/rust-lang/rust-clippy/issues/12788
|
// should skip proc macros, see https://github.com/rust-lang/rust-clippy/issues/12788
|
||||||
#[derive(proc_macro_derive::NonCanonicalClone)]
|
#[derive(proc_macro_derive::NonCanonicalClone)]
|
||||||
pub struct G;
|
pub struct G;
|
||||||
|
|
||||||
|
with_span!(
|
||||||
|
span
|
||||||
|
|
||||||
|
#[derive(Copy)]
|
||||||
|
struct H;
|
||||||
|
impl Clone for H {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: non-canonical implementation of `clone` on a `Copy` type
|
error: non-canonical implementation of `clone` on a `Copy` type
|
||||||
--> tests/ui/non_canonical_clone_impl.rs:11:29
|
--> tests/ui/non_canonical_clone_impl.rs:14:29
|
||||||
|
|
|
|
||||||
LL | fn clone(&self) -> Self {
|
LL | fn clone(&self) -> Self {
|
||||||
| _____________________________^
|
| _____________________________^
|
||||||
@ -11,7 +11,7 @@ LL | | }
|
|||||||
= help: to override `-D warnings` add `#[allow(clippy::non_canonical_clone_impl)]`
|
= help: to override `-D warnings` add `#[allow(clippy::non_canonical_clone_impl)]`
|
||||||
|
|
||||||
error: unnecessary implementation of `clone_from` on a `Copy` type
|
error: unnecessary implementation of `clone_from` on a `Copy` type
|
||||||
--> tests/ui/non_canonical_clone_impl.rs:15:5
|
--> tests/ui/non_canonical_clone_impl.rs:18:5
|
||||||
|
|
|
|
||||||
LL | / fn clone_from(&mut self, source: &Self) {
|
LL | / fn clone_from(&mut self, source: &Self) {
|
||||||
LL | | source.clone();
|
LL | | source.clone();
|
||||||
@ -20,7 +20,7 @@ LL | | }
|
|||||||
| |_____^ help: remove it
|
| |_____^ help: remove it
|
||||||
|
|
||||||
error: non-canonical implementation of `clone` on a `Copy` type
|
error: non-canonical implementation of `clone` on a `Copy` type
|
||||||
--> tests/ui/non_canonical_clone_impl.rs:82:29
|
--> tests/ui/non_canonical_clone_impl.rs:85:29
|
||||||
|
|
|
|
||||||
LL | fn clone(&self) -> Self {
|
LL | fn clone(&self) -> Self {
|
||||||
| _____________________________^
|
| _____________________________^
|
||||||
@ -29,7 +29,7 @@ LL | | }
|
|||||||
| |_____^ help: change this to: `{ *self }`
|
| |_____^ help: change this to: `{ *self }`
|
||||||
|
|
||||||
error: unnecessary implementation of `clone_from` on a `Copy` type
|
error: unnecessary implementation of `clone_from` on a `Copy` type
|
||||||
--> tests/ui/non_canonical_clone_impl.rs:86:5
|
--> tests/ui/non_canonical_clone_impl.rs:89:5
|
||||||
|
|
|
|
||||||
LL | / fn clone_from(&mut self, source: &Self) {
|
LL | / fn clone_from(&mut self, source: &Self) {
|
||||||
LL | | source.clone();
|
LL | | source.clone();
|
||||||
|
Loading…
Reference in New Issue
Block a user