Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
36b1f44
Add a test for `*const Tr<A>` to `*const Tr<B>` casts
WaffleLapkin Jan 22, 2024
d06cf5b
Forbid casts of raw pointers to trait objects with the same trait, bu…
WaffleLapkin Jan 22, 2024
9e8ef92
Add tests for `*const Trait<'a>` -> `*const Trait<'b>` and similar casts
WaffleLapkin Jan 22, 2024
5645e8e
Add more checks for pointers with vtable meta
WaffleLapkin Feb 12, 2024
bb651d3
blessings
WaffleLapkin Feb 13, 2024
eac4916
Disallow `dyn Trait -> dyn Auto` back
WaffleLapkin Jun 4, 2024
e85295c
test blessing
WaffleLapkin Jun 4, 2024
c743557
Actually check that the traits are the same for casting pointers to d…
WaffleLapkin Jun 4, 2024
340d69b
Align the changes to the lang decision
WaffleLapkin Jun 23, 2024
06863ee
Delete `CloneAny` from `rust-analyzer`'s fork of `AnyMap`
WaffleLapkin Jun 23, 2024
cf7032f
Small fixes from review
WaffleLapkin Jun 23, 2024
b16f803
Make `DiagSymbolList` more generic
WaffleLapkin Jul 4, 2024
dc420a2
Use `DiagSymbolList` for a lint diagnostic
WaffleLapkin Jul 4, 2024
52ba120
Remove unhelpful comments and add helpful ones
WaffleLapkin Jul 4, 2024
9ef533e
Fill in tracking issue
WaffleLapkin Jul 4, 2024
a1f20f1
Properly normalize types in bck when checking pointer casts
WaffleLapkin Jul 4, 2024
56de9da
Sort trait names before printing
WaffleLapkin Jul 4, 2024
073f3a2
Equate types instead of using `Unsize`
WaffleLapkin Jul 5, 2024
6aebb2c
Add test.
cjgillot Jul 5, 2024
b97f83b
Verify that allocations output by GVN are sufficiently aligned.
cjgillot Jul 5, 2024
12edc8d
Update compiler/rustc_mir_transform/src/gvn.rs
cjgillot Jul 6, 2024
3e9c9a0
Mark format! with must_use hint
Jul 4, 2024
a0f2b41
clarify `sys::unix::fd::FileDesc::drop` comment (#66876)
tnuha Jul 7, 2024
f3c13bf
Allow casting `*mut dyn T`->`*mut (dyn T + Send)` if `T` has `Send` s…
WaffleLapkin Jul 7, 2024
8076a33
bootstrap: once_cell::sync::Lazy -> std::sync::LazyLock
GrigorenkoPV Jul 7, 2024
c4ee2df
Rollup merge of #120248 - WaffleLapkin:bonk-ptr-object-casts, r=compi…
matthiaskrgr Jul 8, 2024
5b6eb28
Rollup merge of #127355 - aceArt-GmbH:126475, r=oli-obk
matthiaskrgr Jul 8, 2024
3e8e8df
Rollup merge of #127399 - cjgillot:issue-127396, r=oli-obk
matthiaskrgr Jul 8, 2024
55d25ce
Rollup merge of #127460 - Borgerr:clarify-drop-comment, r=jhpratt
matthiaskrgr Jul 8, 2024
a659f7a
Rollup merge of #127467 - GrigorenkoPV:bootstrap-once_cell, r=clubby789
matthiaskrgr Jul 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Delete CloneAny from rust-analyzer's fork of AnyMap
...because it's very sketchy and causes FCWs.
In this case it *is* actually sound, but still.

I should write a better fork of anymap...
  • Loading branch information
WaffleLapkin committed Jul 4, 2024
commit 06863eeebf3dd16119c6605e5234e6938e6c1e95
71 changes: 0 additions & 71 deletions src/tools/rust-analyzer/crates/stdx/src/anymap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,6 @@ pub type RawMap<A> = hash_map::HashMap<TypeId, Box<A>, BuildHasherDefault<TypeId
/// The type parameter `A` allows you to use a different value type; normally you will want
/// it to be `core::any::Any` (also known as `std::any::Any`), but there are other choices:
///
/// - If you want the entire map to be cloneable, use `CloneAny` instead of `Any`; with
/// that, you can only add types that implement `Clone` to the map.
/// - You can add on `+ Send` or `+ Send + Sync` (e.g. `Map<dyn Any + Send>`) to add those
/// auto traits.
///
Expand All @@ -79,9 +77,6 @@ pub type RawMap<A> = hash_map::HashMap<TypeId, Box<A>, BuildHasherDefault<TypeId
/// also spelled [`AnyMap`] for convenience.
/// - <code>[Map]&lt;dyn [core::any::Any] + Send&gt;</code>
/// - <code>[Map]&lt;dyn [core::any::Any] + Send + Sync&gt;</code>
/// - <code>[Map]&lt;dyn [CloneAny]&gt;</code>
/// - <code>[Map]&lt;dyn [CloneAny] + Send&gt;</code>
/// - <code>[Map]&lt;dyn [CloneAny] + Send + Sync&gt;</code>
///
/// ## Example
///
Expand Down Expand Up @@ -205,12 +200,6 @@ mod tests {
assert_debug::<Map<dyn Any>>();
assert_debug::<Map<dyn Any + Send>>();
assert_debug::<Map<dyn Any + Send + Sync>>();
assert_send::<Map<dyn CloneAny + Send>>();
assert_send::<Map<dyn CloneAny + Send + Sync>>();
assert_sync::<Map<dyn CloneAny + Send + Sync>>();
assert_debug::<Map<dyn CloneAny>>();
assert_debug::<Map<dyn CloneAny + Send>>();
assert_debug::<Map<dyn CloneAny + Send + Sync>>();
}

#[test]
Expand All @@ -232,53 +221,6 @@ mod tests {
}
}

// impl some traits for dyn Any
use core::fmt;

#[doc(hidden)]
pub trait CloneToAny {
/// Clone `self` into a new `Box<dyn CloneAny>` object.
fn clone_to_any(&self) -> Box<dyn CloneAny>;
}

impl<T: Any + Clone> CloneToAny for T {
#[inline]
fn clone_to_any(&self) -> Box<dyn CloneAny> {
Box::new(self.clone())
}
}

macro_rules! impl_clone {
($t:ty) => {
impl Clone for Box<$t> {
#[inline]
fn clone(&self) -> Box<$t> {
// SAFETY: this dance is to reapply any Send/Sync marker. I’m not happy about this
// approach, given that I used to do it in safe code, but then came a dodgy
// future-compatibility warning where_clauses_object_safety, which is spurious for
// auto traits but still super annoying (future-compatibility lints seem to mean
// your bin crate needs a corresponding allow!). Although I explained my plight¹
// and it was all explained and agreed upon, no action has been taken. So I finally
// caved and worked around it by doing it this way, which matches what’s done for
// core::any², so it’s probably not *too* bad.
//
// ¹ https://github.com/rust-lang/rust/issues/51443#issuecomment-421988013
// ² https://github.com/rust-lang/rust/blob/e7825f2b690c9a0d21b6f6d84c404bb53b151b38/library/alloc/src/boxed.rs#L1613-L1616
let clone: Box<dyn CloneAny> = (**self).clone_to_any();
let raw: *mut dyn CloneAny = Box::into_raw(clone);
unsafe { Box::from_raw(raw as *mut $t) }
}
}

impl fmt::Debug for $t {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.pad(stringify!($t))
}
}
};
}

/// Methods for downcasting from an `Any`-like trait object.
///
/// This should only be implemented on trait objects for subtraits of `Any`, though you can
Expand Down Expand Up @@ -350,16 +292,3 @@ macro_rules! implement {
implement!(Any);
implement!(Any + Send);
implement!(Any + Send + Sync);

/// [`Any`], but with cloning.
///
/// Every type with no non-`'static` references that implements `Clone` implements `CloneAny`.
/// See [`core::any`] for more details on `Any` in general.
pub trait CloneAny: Any + CloneToAny {}
impl<T: Any + Clone> CloneAny for T {}
implement!(CloneAny);
implement!(CloneAny + Send);
implement!(CloneAny + Send + Sync);
impl_clone!(dyn CloneAny);
impl_clone!(dyn CloneAny + Send);
impl_clone!(dyn CloneAny + Send + Sync);