mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-01 03:03:40 +00:00
Auto merge of #42068 - petrochenkov:ustab, r=nikomatsakis
Stabilize unions with `Copy` fields and no destructor What else is needed: - [x] Documentation (https://github.com/rust-lang-nursery/reference/pull/57). - [x] Making assignments to `Copy` union fields safe (https://github.com/rust-lang/rust/pull/42083). - [ ] Backport? (The "stabilization decision" is from [Apr 13](https://github.com/rust-lang/rust/issues/32836#issuecomment-294018091), it's just this PR is late.) cc https://github.com/rust-lang/rust/issues/32836 r? @nikomatsakis
This commit is contained in:
commit
3e7908f616
@ -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)]
|
||||
|
@ -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);
|
||||
|
@ -29,7 +29,6 @@
|
||||
#![feature(nonzero)]
|
||||
#![feature(unboxed_closures)]
|
||||
#![feature(fn_traits)]
|
||||
#![feature(untagged_unions)]
|
||||
#![feature(associated_consts)]
|
||||
#![feature(unsize)]
|
||||
#![feature(i128_type)]
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -10,8 +10,6 @@
|
||||
|
||||
// ignore-tidy-linelength
|
||||
|
||||
#![feature(untagged_unions)]
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
union U {
|
||||
a: u8,
|
||||
|
@ -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,
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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() {}
|
||||
|
@ -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() {}
|
||||
|
@ -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,
|
||||
|
@ -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> {
|
||||
|
@ -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 {
|
||||
|
@ -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)]
|
||||
|
||||
|
@ -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,
|
||||
}
|
||||
|
@ -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),
|
||||
|
@ -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,
|
||||
|
@ -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;)
|
||||
}
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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 }
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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)]
|
||||
|
Loading…
Reference in New Issue
Block a user