From 698f8c2f01ea549d77d7dc3338a12e04c11057b9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:02:58 +0200 Subject: Adding upstream version 1.64.0+dfsg1. Signed-off-by: Daniel Baumann --- .../functional-struct-update-noncopyable.rs | 14 ++++++++++ .../functional-struct-update-noncopyable.stderr | 12 ++++++++ .../functional-struct-update-respects-privacy.rs | 32 ++++++++++++++++++++++ ...unctional-struct-update-respects-privacy.stderr | 9 ++++++ 4 files changed, 67 insertions(+) create mode 100644 src/test/ui/functional-struct-update/functional-struct-update-noncopyable.rs create mode 100644 src/test/ui/functional-struct-update/functional-struct-update-noncopyable.stderr create mode 100644 src/test/ui/functional-struct-update/functional-struct-update-respects-privacy.rs create mode 100644 src/test/ui/functional-struct-update/functional-struct-update-respects-privacy.stderr (limited to 'src/test/ui/functional-struct-update') diff --git a/src/test/ui/functional-struct-update/functional-struct-update-noncopyable.rs b/src/test/ui/functional-struct-update/functional-struct-update-noncopyable.rs new file mode 100644 index 000000000..a9d7d9c8a --- /dev/null +++ b/src/test/ui/functional-struct-update/functional-struct-update-noncopyable.rs @@ -0,0 +1,14 @@ +// issue 7327 + +use std::sync::Arc; + +struct A { y: Arc, x: Arc } + +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/src/test/ui/functional-struct-update/functional-struct-update-noncopyable.stderr b/src/test/ui/functional-struct-update/functional-struct-update-noncopyable.stderr new file mode 100644 index 000000000..45cdd3d2d --- /dev/null +++ b/src/test/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`, 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/src/test/ui/functional-struct-update/functional-struct-update-respects-privacy.rs b/src/test/ui/functional-struct-update/functional-struct-update-respects-privacy.rs new file mode 100644 index 000000000..500633edf --- /dev/null +++ b/src/test/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 = 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/src/test/ui/functional-struct-update/functional-struct-update-respects-privacy.stderr b/src/test/ui/functional-struct-update/functional-struct-update-respects-privacy.stderr new file mode 100644 index 000000000..0b8af90b4 --- /dev/null +++ b/src/test/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`. -- cgit v1.2.3