diff --git a/clippy_lints/src/derive.rs b/clippy_lints/src/derive.rs index a5f3b1c12f6c..17d17a445afd 100644 --- a/clippy_lints/src/derive.rs +++ b/clippy_lints/src/derive.rs @@ -140,8 +140,10 @@ fn check_copy_clone<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, item: &Item, trait_ref return; // ty is not Copy } - // Some types are not Clone by default but could be cloned `by hand` if necessary match ty.sty { + TypeVariants::TyUnion(..) => return, + + // Some types are not Clone by default but could be cloned “by hand” if necessary TypeVariants::TyEnum(def, substs) | TypeVariants::TyStruct(def, substs) => { for variant in &def.variants { diff --git a/clippy_lints/src/len_zero.rs b/clippy_lints/src/len_zero.rs index e8ca113fab1f..d43e31c6a3db 100644 --- a/clippy_lints/src/len_zero.rs +++ b/clippy_lints/src/len_zero.rs @@ -209,7 +209,8 @@ fn has_is_empty(cx: &LateContext, expr: &Expr) -> bool { } ty::TyProjection(_) => ty.ty_to_def_id().map_or(false, |id| has_is_empty_impl(cx, &id)), ty::TyEnum(id, _) | - ty::TyStruct(id, _) => has_is_empty_impl(cx, &id.did), + ty::TyStruct(id, _) | + ty::TyUnion(id, _) => has_is_empty_impl(cx, &id.did), ty::TyArray(..) | ty::TyStr => true, _ => false, } diff --git a/tests/compile-fail/derive.rs b/tests/compile-fail/derive.rs index 06f1388dc056..cf4467f30a59 100644 --- a/tests/compile-fail/derive.rs +++ b/tests/compile-fail/derive.rs @@ -1,6 +1,8 @@ #![feature(plugin)] #![plugin(clippy)] +#![feature(untagged_unions)] + #![deny(warnings)] #![allow(dead_code)] @@ -45,6 +47,20 @@ impl Clone for Qux { fn clone(&self) -> Self { Qux } } +// looks like unions don't support deriving Clone for now +#[derive(Copy)] +union Union { + a: u8, +} + +impl Clone for Union { + fn clone(&self) -> Self { + Union { + a: 42, + } + } +} + // See #666 #[derive(Copy)] struct Lt<'a> { diff --git a/tests/compile-fail/no_effect.rs b/tests/compile-fail/no_effect.rs index 76c7fa54c019..6616f7bdc86c 100644 --- a/tests/compile-fail/no_effect.rs +++ b/tests/compile-fail/no_effect.rs @@ -4,6 +4,7 @@ #![deny(no_effect, unnecessary_operation)] #![allow(dead_code)] #![allow(path_statements)] +#![feature(untagged_unions)] struct Unit; struct Tuple(i32); @@ -15,6 +16,11 @@ enum Enum { Struct { field: i32 }, } +union Union { + a: u8, + b: f64, +} + fn get_number() -> i32 { 0 } fn get_struct() -> Struct { Struct { field: 0 } } @@ -30,6 +36,7 @@ fn main() { Tuple(0); //~ERROR statement with no effect Struct { field: 0 }; //~ERROR statement with no effect Struct { ..s }; //~ERROR statement with no effect + Union { a: 0 }; //~ERROR statement with no effect Enum::Tuple(0); //~ERROR statement with no effect Enum::Struct { field: 0 }; //~ERROR statement with no effect 5 + 6; //~ERROR statement with no effect