From 46fe8e99665d6a210f6dc16590127ee808e60366 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 22 Jul 2017 01:17:53 +0200 Subject: [PATCH] Don't warn on unused field on union --- src/librustc/middle/dead.rs | 18 +++++++++++++++--- src/test/ui/union-fields.rs | 29 +++++++++++++++++++++++++++++ src/test/ui/union-fields.stderr | 14 ++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/test/ui/union-fields.rs create mode 100644 src/test/ui/union-fields.stderr diff --git a/src/librustc/middle/dead.rs b/src/librustc/middle/dead.rs index 2238e464cbcd..91d25c680d87 100644 --- a/src/librustc/middle/dead.rs +++ b/src/librustc/middle/dead.rs @@ -13,7 +13,7 @@ // from live codes are live, and everything else is dead. use hir::map as hir_map; -use hir::{self, PatKind}; +use hir::{self, Item_, PatKind}; use hir::intravisit::{self, Visitor, NestedVisitorMap}; use hir::itemlikevisit::ItemLikeVisitor; @@ -558,8 +558,20 @@ impl<'a, 'tcx> Visitor<'tcx> for DeadVisitor<'a, 'tcx> { fn visit_struct_field(&mut self, field: &'tcx hir::StructField) { if self.should_warn_about_field(&field) { - self.warn_dead_code(field.id, field.span, - field.name, "field"); + let did = self.tcx.hir.get_parent_did(field.id); + if if let Some(node_id) = self.tcx.hir.as_local_node_id(did) { + match self.tcx.hir.find(node_id) { + Some(hir_map::NodeItem(item)) => match item.node { + Item_::ItemUnion(_, _) => false, + _ => true, + }, + _ => true, + } + } else { + true + } { + self.warn_dead_code(field.id, field.span, field.name, "field"); + } } intravisit::walk_struct_field(self, field); diff --git a/src/test/ui/union-fields.rs b/src/test/ui/union-fields.rs new file mode 100644 index 000000000000..87a617301336 --- /dev/null +++ b/src/test/ui/union-fields.rs @@ -0,0 +1,29 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![deny(dead_code)] + +union U { + x: u32, + y: f32, +} + +struct V { + x: u32, + y: u32, +} + +fn main() { + let u = U { x: 0x3f800000 }; + let _f = unsafe { u.y }; + let v = V { x: 0, y: 0 }; + println!("{}", v.x); +} + diff --git a/src/test/ui/union-fields.stderr b/src/test/ui/union-fields.stderr new file mode 100644 index 000000000000..d0f1a9214255 --- /dev/null +++ b/src/test/ui/union-fields.stderr @@ -0,0 +1,14 @@ +error: field is never used: `y` + --> $DIR/union-fields.rs:20:5 + | +20 | y: u32, + | ^^^^^^ + | +note: lint level defined here + --> $DIR/union-fields.rs:11:9 + | +11 | #![deny(dead_code)] + | ^^^^^^^^^ + +error: aborting due to previous error +