Skip to content

Commit

Permalink
Stabilize unions with Copy fields and no destructor
Browse files Browse the repository at this point in the history
  • Loading branch information
petrochenkov committed May 26, 2017
1 parent 5579677 commit 73c73e4
Show file tree
Hide file tree
Showing 32 changed files with 42 additions and 62 deletions.
1 change: 0 additions & 1 deletion src/libcollections/lib.rs
Expand Up @@ -65,7 +65,6 @@
#![feature(trusted_len)]
#![feature(unicode)]
#![feature(unique)]
#![feature(untagged_unions)]
#![cfg_attr(not(test), feature(str_checked_slicing))]
#![cfg_attr(test, feature(rand, test))]
#![feature(offset_to)]
Expand Down
21 changes: 21 additions & 0 deletions src/librustc/middle/stability.rs
Expand Up @@ -625,6 +625,27 @@ impl<'a, 'tcx> Visitor<'tcx> for Checker<'a, 'tcx> {
}
}

// There's no good place to insert stability check for non-Copy unions,
// so semi-randomly perform it here in stability.rs
hir::ItemUnion(..) if !self.tcx.sess.features.borrow().untagged_unions => {
let def_id = self.tcx.hir.local_def_id(item.id);
let adt_def = self.tcx.adt_def(def_id);
let ty = self.tcx.type_of(def_id);

if adt_def.has_dtor(self.tcx) {
emit_feature_err(&self.tcx.sess.parse_sess,
"untagged_unions", item.span, GateIssue::Language,
"unions with `Drop` implementations are unstable");
} else {
let param_env = self.tcx.param_env(def_id);
if !param_env.can_type_implement_copy(self.tcx, ty, item.span).is_ok() {
emit_feature_err(&self.tcx.sess.parse_sess,
"untagged_unions", item.span, GateIssue::Language,
"unions with non-`Copy` fields are unstable");
}
}
}

_ => (/* pass */)
}
intravisit::walk_item(self, item);
Expand Down
1 change: 0 additions & 1 deletion src/librustc_data_structures/lib.rs
Expand Up @@ -29,7 +29,6 @@
#![feature(nonzero)]
#![feature(unboxed_closures)]
#![feature(fn_traits)]
#![feature(untagged_unions)]
#![feature(associated_consts)]
#![feature(unsize)]
#![feature(i128_type)]
Expand Down
6 changes: 0 additions & 6 deletions src/libsyntax/feature_gate.rs
Expand Up @@ -1207,12 +1207,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
}
}

ast::ItemKind::Union(..) => {
gate_feature_post!(&self, untagged_unions,
i.span,
"unions are unstable and possibly buggy");
}

ast::ItemKind::DefaultImpl(..) => {
gate_feature_post!(&self, optin_builtin_traits,
i.span,
Expand Down
Expand Up @@ -8,10 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// ignore-tidy-linelength

#![feature(untagged_unions)]

#[derive(Clone, Copy)]
struct S {
a: u8,
Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/borrowck/borrowck-union-borrow.rs
Expand Up @@ -10,8 +10,6 @@

// ignore-tidy-linelength

#![feature(untagged_unions)]

#[derive(Clone, Copy)]
union U {
a: u8,
Expand Down
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

struct S {
a: u8,
}
Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/privacy/union-field-privacy-1.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

mod m {
pub union U {
pub a: u8,
Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/privacy/union-field-privacy-2.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

mod m {
pub union U {
pub a: u8,
Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/union/union-const-eval.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

union U {
a: usize,
b: usize,
Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/union/union-const-pat.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

union U {
a: usize,
b: usize,
Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/union/union-derive.rs
Expand Up @@ -10,8 +10,6 @@

// Most traits cannot be derived for unions.

#![feature(untagged_unions)]

#[derive(
PartialEq, //~ ERROR this trait cannot be derived for unions
PartialOrd, //~ ERROR this trait cannot be derived for unions
Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/union/union-empty.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

union U {} //~ ERROR unions cannot have zero fields

fn main() {}
22 changes: 21 additions & 1 deletion src/test/compile-fail/union/union-feature-gate.rs
Expand Up @@ -10,8 +10,28 @@

// gate-test-untagged_unions

union U { //~ ERROR unions are unstable and possibly buggy
union U1 { // OK
a: u8,
}

union U2<T: Copy> { // OK
a: T,
}

union U3 { //~ ERROR unions with non-`Copy` fields are unstable
a: String,
}

union U4<T> { //~ ERROR unions with non-`Copy` fields are unstable
a: T,
}

union U5 { //~ ERROR unions with `Drop` implementations are unstable
a: u8,
}

impl Drop for U5 {
fn drop(&mut self) {}
}

fn main() {}
2 changes: 0 additions & 2 deletions src/test/compile-fail/union/union-fields.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

union U {
a: u8,
b: u16,
Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/union/union-generic.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

use std::rc::Rc;

union U<T: Copy> {
Expand Down
1 change: 0 additions & 1 deletion src/test/compile-fail/union/union-lint-dead-code.rs
Expand Up @@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]
#![deny(dead_code)]

union Foo {
Expand Down
1 change: 0 additions & 1 deletion src/test/compile-fail/union/union-repr-c.rs
Expand Up @@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]
#![allow(unused)]
#![deny(improper_ctypes)]

Expand Down
2 changes: 0 additions & 2 deletions src/test/compile-fail/union/union-suggest-field.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

union U {
principal: u8,
}
Expand Down
1 change: 0 additions & 1 deletion src/test/debuginfo/union-smoke.rs
Expand Up @@ -34,7 +34,6 @@
#![allow(unused)]
#![feature(omit_gdb_pretty_printer_section)]
#![omit_gdb_pretty_printer_section]
#![feature(untagged_unions)]

union U {
a: (u8, u8),
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/auxiliary/union.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

pub union U {
pub a: u8,
pub b: u16,
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-backcomp.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

macro_rules! union {
() => (struct S;)
}
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-basic.rs
Expand Up @@ -13,8 +13,6 @@
// FIXME: This test case makes little-endian assumptions.
// ignore-s390x

#![feature(untagged_unions)]

extern crate union;
use std::mem::{size_of, align_of, zeroed};

Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-c-interop.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

#[derive(Clone, Copy)]
#[repr(C)]
struct LARGE_INTEGER_U {
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-const-trans.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

union U {
a: u64,
b: u64,
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-inherent-method.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

union U {
a: u8,
}
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-macro.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

macro_rules! duplicate {
($i: item) => {
mod m1 {
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-pat-refutability.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

#[repr(u32)]
enum Tag { I, F }

Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-trait-impl.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

use std::fmt;

union U {
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/union/union-transmute.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

extern crate core;
use core::f32;

Expand Down
2 changes: 0 additions & 2 deletions src/test/rustdoc/union.rs
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(untagged_unions)]

// @has union/union.U.html
pub union U {
// @has - //pre "pub a: u8"
Expand Down
2 changes: 0 additions & 2 deletions src/test/ui/print_type_sizes/packed.rs
Expand Up @@ -18,8 +18,6 @@
// aligned (while on most it is 8-byte aligned) and so the resulting
// padding and overall computed sizes can be quite different.

#![feature(untagged_unions)]

#![allow(dead_code)]

#[derive(Default)]
Expand Down

0 comments on commit 73c73e4

Please sign in to comment.