Address comments and add requested tests
This commit is contained in:
parent
e67c2282af
commit
93067ca089
47 changed files with 582 additions and 61 deletions
30
src/test/compile-fail/privacy/union-field-privacy-1.rs
Normal file
30
src/test/compile-fail/privacy/union-field-privacy-1.rs
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(pub_restricted)]
|
||||
#![feature(untagged_unions)]
|
||||
|
||||
mod m {
|
||||
pub union U {
|
||||
pub a: u8,
|
||||
pub(super) b: u8,
|
||||
c: u8,
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let u = m::U { a: 0 }; // OK
|
||||
let u = m::U { b: 0 }; // OK
|
||||
let u = m::U { c: 0 }; //~ ERROR field `c` of union `m::U` is private
|
||||
|
||||
let m::U { a } = u; // OK
|
||||
let m::U { b } = u; // OK
|
||||
let m::U { c } = u; //~ ERROR field `c` of union `m::U` is private
|
||||
}
|
||||
28
src/test/compile-fail/privacy/union-field-privacy-2.rs
Normal file
28
src/test/compile-fail/privacy/union-field-privacy-2.rs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(pub_restricted)]
|
||||
#![feature(untagged_unions)]
|
||||
|
||||
mod m {
|
||||
pub union U {
|
||||
pub a: u8,
|
||||
pub(super) b: u8,
|
||||
c: u8,
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let u = m::U { a: 10 };
|
||||
|
||||
let a = u.a; // OK
|
||||
let b = u.b; // OK
|
||||
let c = u.c; //~ ERROR field `c` of struct `m::U` is private
|
||||
}
|
||||
26
src/test/compile-fail/union/union-copy.rs
Normal file
26
src/test/compile-fail/union/union-copy.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(untagged_unions)]
|
||||
|
||||
union U {
|
||||
a: u8
|
||||
}
|
||||
|
||||
union W {
|
||||
a: String
|
||||
}
|
||||
|
||||
impl Clone for U { fn clone(&self) { panic!(); } }
|
||||
impl Clone for W { fn clone(&self) { panic!(); } }
|
||||
impl Copy for U {} // OK
|
||||
impl Copy for W {} //~ ERROR the trait `Copy` may not be implemented for this type
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -8,14 +8,8 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(untagged_unions)]
|
||||
|
||||
mod m {
|
||||
pub union U {
|
||||
a: u8
|
||||
}
|
||||
union U { //~ ERROR unions are unstable and possibly buggy
|
||||
a: u8,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let u = m::U { a: 0 }; //~ ERROR field `a` of union `m::U` is private
|
||||
}
|
||||
fn main() {}
|
||||
|
|
@ -24,11 +24,12 @@ fn main() {
|
|||
let u = U { ..u }; //~ ERROR union expressions should have exactly one field
|
||||
//~^ ERROR functional record update syntax requires a struct
|
||||
|
||||
let U {} = u; //~ ERROR union patterns without `..` should have at least one field
|
||||
let U {} = u; //~ ERROR union patterns should have exactly one field
|
||||
let U { a } = u; // OK
|
||||
let U { a, b } = u; //~ ERROR union patterns can have at most one field
|
||||
let U { a, b, c } = u; //~ ERROR union patterns can have at most one field
|
||||
let U { a, b } = u; //~ ERROR union patterns should have exactly one field
|
||||
let U { a, b, c } = u; //~ ERROR union patterns should have exactly one field
|
||||
//~^ ERROR union `U` does not have a field named `c`
|
||||
let U { .. } = u; // OK
|
||||
let U { a, .. } = u; // OK
|
||||
let U { .. } = u; //~ ERROR union patterns should have exactly one field
|
||||
//~^ ERROR `..` cannot be used in union patterns
|
||||
let U { a, .. } = u; //~ ERROR `..` cannot be used in union patterns
|
||||
}
|
||||
24
src/test/compile-fail/union/union-generic.rs
Normal file
24
src/test/compile-fail/union/union-generic.rs
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// 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> {
|
||||
a: T
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let u = U { a: Rc::new(0u32) };
|
||||
//~^ ERROR the trait bound `std::rc::Rc<u32>: std::marker::Copy` is not satisfied
|
||||
let u = U::<Rc<u32>> { a: Default::default() };
|
||||
//~^ ERROR the trait bound `std::rc::Rc<u32>: std::marker::Copy` is not satisfied
|
||||
}
|
||||
29
src/test/compile-fail/union/union-repr-c.rs
Normal file
29
src/test/compile-fail/union/union-repr-c.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(untagged_unions)]
|
||||
#![allow(unused)]
|
||||
#![deny(improper_ctypes)]
|
||||
|
||||
#[repr(C)]
|
||||
union U {
|
||||
a: u8,
|
||||
}
|
||||
|
||||
union W {
|
||||
a: u8,
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
static FOREIGN1: U; // OK
|
||||
static FOREIGN2: W; //~ ERROR found union without foreign-function-safe representation
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
29
src/test/compile-fail/union/union-suggest-field.rs
Normal file
29
src/test/compile-fail/union/union-suggest-field.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(untagged_unions)]
|
||||
|
||||
union U {
|
||||
principal: u8,
|
||||
}
|
||||
|
||||
impl U {
|
||||
fn calculate(&self) {}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let u = U { principle: 0 }; //~ ERROR union `U` has no field named `principle`
|
||||
//~^ HELP did you mean `principal`?
|
||||
let w = u.principial; //~ ERROR attempted access of field `principial` on type `U`
|
||||
//~^ HELP did you mean `principal`?
|
||||
|
||||
let y = u.calculate; //~ ERROR attempted to take value of method `calculate` on type `U`
|
||||
//~^ HELP maybe a `()` to call it is missing?
|
||||
}
|
||||
|
|
@ -15,9 +15,10 @@ union U {
|
|||
}
|
||||
|
||||
fn main() {
|
||||
let u = U { a: 10 }; // OK
|
||||
let mut u = U { a: 10 }; // OK
|
||||
let a = u.a; //~ ERROR access to union field requires unsafe function or block
|
||||
u.a = 11; //~ ERROR access to union field requires unsafe function or block
|
||||
let U { a } = u; //~ ERROR matching on union field requires unsafe function or block
|
||||
if let U { a: 11 } = u {} //~ ERROR matching on union field requires unsafe function or block
|
||||
let U { .. } = u; // OK
|
||||
if let U { a: 12 } = u {} //~ ERROR matching on union field requires unsafe function or block
|
||||
// let U { .. } = u; // OK
|
||||
}
|
||||
|
|
@ -12,6 +12,12 @@
|
|||
|
||||
union U {
|
||||
a: str, //~ ERROR the trait bound `str: std::marker::Sized` is not satisfied
|
||||
b: u8,
|
||||
}
|
||||
|
||||
union W {
|
||||
a: u8,
|
||||
b: str, //~ ERROR the trait bound `str: std::marker::Sized` is not satisfied
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue