Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[beta] Stabilize unions with Copy fields and no destructor #42321

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/bootstrap/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ pub const CFG_RELEASE_NUM: &'static str = "1.18.0";
// An optional number to put after the label, e.g. '.2' -> '-beta.2'
// Be sure to make this starts with a dot to conform to semver pre-release
// versions (section 9)
pub const CFG_PRERELEASE_VERSION: &'static str = ".4";
pub const CFG_PRERELEASE_VERSION: &'static str = ".5";

pub struct GitInfo {
inner: Option<Info>,
Expand Down
1 change: 0 additions & 1 deletion src/libcollections/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,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
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,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
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#![feature(staged_api)]
#![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
Original file line number Diff line number Diff line change
Expand Up @@ -1202,12 +1202,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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@

// ignore-tidy-linelength

#![feature(untagged_unions)]

#[derive(Clone, Copy)]
union U {
a: u8,
Expand Down
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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