Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement alloc::sync::UniqueArc #133572

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

frank-king
Copy link
Contributor

This implements the alloc::sync::UniqueArc part of #112566.

@rustbot
Copy link
Collaborator

rustbot commented Nov 28, 2024

r? @Amanieu

rustbot has assigned @Amanieu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Nov 28, 2024
@rust-log-analyzer

This comment has been minimized.

@steffahn
Copy link
Member

Hah! I’m just noticing that this, as well as UniqueRc, absolutely must be invariant (w.r.t. the parameter T).

Otherwise, you can

fn extend_lifetime<'a, 'b>(x: &'a str) -> &'b str {
    let r = UniqueRc::new(""); // UniqueRc<&'static str>
    let w = UniqueRc::downgrade(&r); // Weak<&'static str>
    let mut r = r; // COVARIANT: ==>> UniqueRc<&'a str>
    *r = x; // assign the &'a str
    let _r = UniqueRc::into_rc(r); // Rc<&'a str>, but we only care to activate the weak
    let r = w.upgrade().unwrap(); // upgrade succeeds: Rc<&'static str>
    *r // &'static str, coerces to &'b str
}

(playground)

@bors
Copy link
Contributor

bors commented Jan 11, 2025

☔ The latest upstream changes (presumably #135357) made this pull request unmergeable. Please resolve the merge conflicts.

jhpratt added a commit to jhpratt/rust that referenced this pull request Jan 12, 2025
…k-Simulacrum

Make (unstable API) `UniqueRc` invariant for soundness

Add test case from rust-lang#133572 (comment) (comment in review of `UniqueArc`), and fix the issue for `UniqueRc`.
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Jan 12, 2025
…k-Simulacrum

Make (unstable API) `UniqueRc` invariant for soundness

Add test case from rust-lang#133572 (comment) (comment in review of `UniqueArc`), and fix the issue for `UniqueRc`.
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Jan 12, 2025
Rollup merge of rust-lang#135379 - steffahn:uniquerc-invariant, r=Mark-Simulacrum

Make (unstable API) `UniqueRc` invariant for soundness

Add test case from rust-lang#133572 (comment) (comment in review of `UniqueArc`), and fix the issue for `UniqueRc`.
@frank-king frank-king force-pushed the feature/unique_arc branch from 5142171 to 9310c96 Compare March 3, 2025 02:54
@rust-log-analyzer

This comment has been minimized.

@frank-king frank-king force-pushed the feature/unique_arc branch from 951fa08 to 0b2c03e Compare March 3, 2025 08:46
Comment on lines 4443 to 4431
}

#[unstable(feature = "unique_rc_arc", issue = "112566")]
unsafe impl<#[may_dangle] T: ?Sized, A: Allocator> Drop for UniqueArc<T, A> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
}
#[unstable(feature = "unique_rc_arc", issue = "112566")]
unsafe impl<#[may_dangle] T: ?Sized, A: Allocator> Drop for UniqueArc<T, A> {
}
#[unstable(feature = "deref_pure_trait", issue = "87121")]
unsafe impl<T: ?Sized, A: Allocator> DerefPure for Arc<T, A> {}
#[unstable(feature = "unique_rc_arc", issue = "112566")]
unsafe impl<#[may_dangle] T: ?Sized, A: Allocator> Drop for UniqueArc<T, A> {

Copy link
Contributor Author

@frank-king frank-king Mar 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean impl DerefPure for UniqueArc here? (is Arc here a typo?)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes it should be UniqueArc that's my bad

Comment on lines 4169 to 4187

/// Inequality for two `UniqueArc`s.
///
/// Two `UniqueArc`s are not equal if their inner values are not equal.
///
/// # Examples
///
/// ```
/// #![feature(unique_rc_arc)]
/// use std::sync::UniqueArc;
///
/// let five = UniqueArc::new(5);
///
/// assert!(five != UniqueArc::new(6));
/// ```
#[inline]
fn ne(&self, other: &Self) -> bool {
PartialEq::ne(&**self, &**other)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// Inequality for two `UniqueArc`s.
///
/// Two `UniqueArc`s are not equal if their inner values are not equal.
///
/// # Examples
///
/// ```
/// #![feature(unique_rc_arc)]
/// use std::sync::UniqueArc;
///
/// let five = UniqueArc::new(5);
///
/// assert!(five != UniqueArc::new(6));
/// ```
#[inline]
fn ne(&self, other: &Self) -> bool {
PartialEq::ne(&**self, &**other)
}

Implementations must ensure that eq and ne are consistent with each other:

  • a != b if and only if !(a == b).

The default implementation of ne provides this consistency and is almost always sufficient. It should not be overridden without very good reason.

https://doc.rust-lang.org/std/cmp/trait.PartialEq.html

Copy link
Contributor Author

@frank-king frank-king Mar 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But how about the user overrides <T as PartialEq>::ne? Then the behaviours of <T as PartialEq>::ne and <Arc<T> as PartialEq>::ne are inconsistent.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See #98655 for some context, but the only possible correct implementation of ne is !eq, so there is no reason to override it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, thank you. Should I remove the overidden implementation of <Rc as PartialEq>::ne too?

@frank-king frank-king force-pushed the feature/unique_arc branch from 0b2c03e to ff35547 Compare March 5, 2025 13:48
@frank-king frank-king force-pushed the feature/unique_arc branch from ff35547 to d4783e3 Compare March 6, 2025 14:16
@bors
Copy link
Contributor

bors commented Mar 8, 2025

☔ The latest upstream changes (presumably #138208) made this pull request unmergeable. Please resolve the merge conflicts.

github-actions bot pushed a commit to tautschnig/verify-rust-std that referenced this pull request Mar 11, 2025
…k-Simulacrum

Make (unstable API) `UniqueRc` invariant for soundness

Add test case from rust-lang#133572 (comment) (comment in review of `UniqueArc`), and fix the issue for `UniqueRc`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants