diff --git a/crates/block2/src/concrete_block.rs b/crates/block2/src/concrete_block.rs index d2884e342..87dc7e11f 100644 --- a/crates/block2/src/concrete_block.rs +++ b/crates/block2/src/concrete_block.rs @@ -215,7 +215,7 @@ impl ConcreteBlock { /// correct arguments. unsafe fn with_invoke(invoke: unsafe extern "C" fn(), closure: F) -> Self { let layout = abi::Block_layout { - isa: unsafe { &ffi::_NSConcreteStackBlock }, + isa: unsafe { ptr::addr_of!(ffi::_NSConcreteStackBlock) }, flags: Self::FLAGS, reserved: 0, invoke: Some(invoke), diff --git a/crates/block2/src/debug.rs b/crates/block2/src/debug.rs index 430a87d98..212dc5c46 100644 --- a/crates/block2/src/debug.rs +++ b/crates/block2/src/debug.rs @@ -11,11 +11,14 @@ struct Isa(*const ffi::Class); impl Isa { fn is_global(self) -> bool { - ptr::eq(unsafe { &ffi::_NSConcreteGlobalBlock }, self.0) + ptr::eq( + unsafe { ptr::addr_of!(ffi::_NSConcreteGlobalBlock) }, + self.0, + ) } fn is_stack(self) -> bool { - ptr::eq(unsafe { &ffi::_NSConcreteStackBlock }, self.0) + ptr::eq(unsafe { ptr::addr_of!(ffi::_NSConcreteStackBlock) }, self.0) } } @@ -216,13 +219,13 @@ mod tests { #[test] fn test_isa() { - let isa = Isa(unsafe { &ffi::_NSConcreteGlobalBlock }); + let isa = Isa(unsafe { ptr::addr_of!(ffi::_NSConcreteGlobalBlock) }); assert!(isa.is_global()); assert!(!isa.is_stack()); - let isa = Isa(unsafe { &ffi::_NSConcreteStackBlock }); + let isa = Isa(unsafe { ptr::addr_of!(ffi::_NSConcreteStackBlock) }); assert!(!isa.is_global()); assert!(isa.is_stack()); - let isa = Isa(unsafe { &ffi::private::_NSConcreteMallocBlock }); + let isa = Isa(unsafe { ptr::addr_of!(ffi::private::_NSConcreteMallocBlock) }); assert!(!isa.is_global()); assert!(!isa.is_stack()); let isa = Isa(ptr::null()); diff --git a/crates/block2/src/ffi.rs b/crates/block2/src/ffi.rs index a8776d177..92477a613 100644 --- a/crates/block2/src/ffi.rs +++ b/crates/block2/src/ffi.rs @@ -153,9 +153,11 @@ mod tests { #[test] fn test_linkable() { - println!("{:p}", unsafe { &_NSConcreteGlobalBlock }); - println!("{:p}", unsafe { &_NSConcreteStackBlock }); - println!("{:p}", unsafe { &private::_NSConcreteMallocBlock }); + println!("{:?}", unsafe { ptr::addr_of!(_NSConcreteGlobalBlock) }); + println!("{:?}", unsafe { ptr::addr_of!(_NSConcreteStackBlock) }); + println!("{:?}", unsafe { + ptr::addr_of!(private::_NSConcreteMallocBlock) + }); println!("{:p}", _Block_copy as unsafe extern "C" fn(_) -> _); println!( "{:p}", diff --git a/crates/block2/src/global.rs b/crates/block2/src/global.rs index 47c409b24..adca770d4 100644 --- a/crates/block2/src/global.rs +++ b/crates/block2/src/global.rs @@ -171,7 +171,7 @@ macro_rules! global_block { #[allow(unused_unsafe)] $vis static $name: $crate::GlobalBlock<($($t,)*) $(, $r)?> = unsafe { let mut layout = $crate::GlobalBlock::<($($t,)*) $(, $r)?>::__DEFAULT_LAYOUT; - layout.isa = &$crate::ffi::_NSConcreteGlobalBlock; + layout.isa = ::core::ptr::addr_of!($crate::ffi::_NSConcreteGlobalBlock); layout.invoke = ::core::option::Option::Some({ unsafe extern "C" fn inner(_: *mut $crate::__Block_layout, $($a: $t),*) $(-> $r)? { $body