#![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)]
}
}
+ // 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);
#![feature(nonzero)]
#![feature(unboxed_closures)]
#![feature(fn_traits)]
-#![feature(untagged_unions)]
#![feature(associated_consts)]
#![feature(unsize)]
#![feature(i128_type)]
}
}
- 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,
// 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,
// ignore-tidy-linelength
-#![feature(untagged_unions)]
-
#[derive(Clone, Copy)]
union U {
a: u8,
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
struct S {
a: u8,
}
// 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,
// 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,
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
union U {
a: usize,
b: usize,
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
union U {
a: usize,
b: usize,
// 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
// 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() {}
// 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() {}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
union U {
a: u8,
b: u16,
// 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> {
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
#![deny(dead_code)]
union Foo {
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
#![allow(unused)]
#![deny(improper_ctypes)]
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
union U {
principal: u8,
}
#![allow(unused)]
#![feature(omit_gdb_pretty_printer_section)]
#![omit_gdb_pretty_printer_section]
-#![feature(untagged_unions)]
union U {
a: (u8, u8),
// 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,
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
macro_rules! union {
() => (struct S;)
}
// FIXME: This test case makes little-endian assumptions.
// ignore-s390x
-#![feature(untagged_unions)]
-
extern crate union;
use std::mem::{size_of, align_of, zeroed};
// 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 {
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
union U {
a: u64,
b: u64,
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
union U {
a: u8,
}
// 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 {
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
#[repr(u32)]
enum Tag { I, F }
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
use std::fmt;
union U {
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(untagged_unions)]
-
extern crate core;
use core::f32;
// 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"
// 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)]