diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:03 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:03 +0000 |
commit | 64d98f8ee037282c35007b64c2649055c56af1db (patch) | |
tree | 5492bcf97fce41ee1c0b1cc2add283f3e66cdab0 /tests/ui/functional-struct-update | |
parent | Adding debian version 1.67.1+dfsg1-1. (diff) | |
download | rustc-64d98f8ee037282c35007b64c2649055c56af1db.tar.xz rustc-64d98f8ee037282c35007b64c2649055c56af1db.zip |
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/functional-struct-update')
4 files changed, 67 insertions, 0 deletions
diff --git a/tests/ui/functional-struct-update/functional-struct-update-noncopyable.rs b/tests/ui/functional-struct-update/functional-struct-update-noncopyable.rs new file mode 100644 index 000000000..a9d7d9c8a --- /dev/null +++ b/tests/ui/functional-struct-update/functional-struct-update-noncopyable.rs @@ -0,0 +1,14 @@ +// issue 7327 + +use std::sync::Arc; + +struct A { y: Arc<isize>, x: Arc<isize> } + +impl Drop for A { + fn drop(&mut self) { println!("x={}", *self.x); } +} +fn main() { + let a = A { y: Arc::new(1), x: Arc::new(2) }; + let _b = A { y: Arc::new(3), ..a }; //~ ERROR cannot move out of type `A` + let _c = a; +} diff --git a/tests/ui/functional-struct-update/functional-struct-update-noncopyable.stderr b/tests/ui/functional-struct-update/functional-struct-update-noncopyable.stderr new file mode 100644 index 000000000..45cdd3d2d --- /dev/null +++ b/tests/ui/functional-struct-update/functional-struct-update-noncopyable.stderr @@ -0,0 +1,12 @@ +error[E0509]: cannot move out of type `A`, which implements the `Drop` trait + --> $DIR/functional-struct-update-noncopyable.rs:12:14 + | +LL | let _b = A { y: Arc::new(3), ..a }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | cannot move out of here + | move occurs because `a.x` has type `Arc<isize>`, which does not implement the `Copy` trait + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0509`. diff --git a/tests/ui/functional-struct-update/functional-struct-update-respects-privacy.rs b/tests/ui/functional-struct-update/functional-struct-update-respects-privacy.rs new file mode 100644 index 000000000..500633edf --- /dev/null +++ b/tests/ui/functional-struct-update/functional-struct-update-respects-privacy.rs @@ -0,0 +1,32 @@ +// RFC 736 (and Issue 21407): functional struct update should respect privacy. + +// The `foo` module attempts to maintains an invariant that each `S` +// has a unique `u64` id. +use self::foo::S; +mod foo { + use std::cell::{UnsafeCell}; + + static mut COUNT : UnsafeCell<u64> = UnsafeCell::new(1); + + pub struct S { pub a: u8, pub b: String, secret_uid: u64 } + + pub fn make_secrets(a: u8, b: String) -> S { + let val = unsafe { let p = COUNT.get(); let val = *p; *p = val + 1; val }; + println!("creating {}, uid {}", b, val); + S { a: a, b: b, secret_uid: val } + } + + impl Drop for S { + fn drop(&mut self) { + println!("dropping {}, uid {}", self.b, self.secret_uid); + } + } +} + +fn main() { + let s_1 = foo::make_secrets(3, format!("ess one")); + let s_2 = foo::S { b: format!("ess two"), ..s_1 }; // FRU ... + //~^ ERROR field `secret_uid` of struct `S` is private + println!("main forged an S named: {}", s_2.b); + // at end of scope, ... both s_1 *and* s_2 get dropped. Boom! +} diff --git a/tests/ui/functional-struct-update/functional-struct-update-respects-privacy.stderr b/tests/ui/functional-struct-update/functional-struct-update-respects-privacy.stderr new file mode 100644 index 000000000..0b8af90b4 --- /dev/null +++ b/tests/ui/functional-struct-update/functional-struct-update-respects-privacy.stderr @@ -0,0 +1,9 @@ +error[E0451]: field `secret_uid` of struct `S` is private + --> $DIR/functional-struct-update-respects-privacy.rs:28:49 + | +LL | let s_2 = foo::S { b: format!("ess two"), ..s_1 }; // FRU ... + | ^^^ field `secret_uid` is private + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0451`. |