Auto merge of #10189 - Alexendoo:copy-packed-struct, r=giraffate
expl_impl_clone_on_copy: ignore packed structs with type/const params changelog: [`expl_impl_clone_on_copy`]: Ignore `#[repr(packed)]` structs with type or const paramaters Fixes #10188 A more involved solution that checks if any bound on the trait impl aren't present on the struct definition would be ideal, but I couldn't see a nice way to go about that
This commit is contained in:
commit
a95286b852
@ -14,8 +14,8 @@
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::traits::Reveal;
|
||||
use rustc_middle::ty::{
|
||||
self, Binder, BoundConstness, Clause, GenericParamDefKind, ImplPolarity, ParamEnv, PredicateKind, TraitPredicate,
|
||||
Ty, TyCtxt,
|
||||
self, Binder, BoundConstness, Clause, GenericArgKind, GenericParamDefKind, ImplPolarity, ParamEnv, PredicateKind,
|
||||
TraitPredicate, Ty, TyCtxt,
|
||||
};
|
||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||
use rustc_span::source_map::Span;
|
||||
@ -366,6 +366,15 @@ fn check_copy_clone<'tcx>(cx: &LateContext<'tcx>, item: &Item<'_>, trait_ref: &h
|
||||
if ty_subs.types().any(|ty| !implements_trait(cx, ty, clone_id, &[])) {
|
||||
return;
|
||||
}
|
||||
// `#[repr(packed)]` structs with type/const parameters can't derive `Clone`.
|
||||
// https://github.com/rust-lang/rust-clippy/issues/10188
|
||||
if ty_adt.repr().packed()
|
||||
&& ty_subs
|
||||
.iter()
|
||||
.any(|arg| matches!(arg.unpack(), GenericArgKind::Type(_) | GenericArgKind::Const(_)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
span_lint_and_note(
|
||||
cx,
|
||||
|
@ -85,4 +85,15 @@ fn clone(&self) -> Self {
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/rust-lang/rust-clippy/issues/10188
|
||||
#[repr(packed)]
|
||||
#[derive(Copy)]
|
||||
struct Packed<T>(T);
|
||||
|
||||
impl<T: Copy> Clone for Packed<T> {
|
||||
fn clone(&self) -> Self {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
Loading…
Reference in New Issue
Block a user