@@ -2291,7 +2291,7 @@ impl<T> AtomicPtr<T> {
2291
2291
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
2292
2292
pub fn fetch_byte_add ( & self , val : usize , order : Ordering ) -> * mut T {
2293
2293
// SAFETY: data races are prevented by atomic intrinsics.
2294
- unsafe { atomic_add ( self . p . get ( ) , core :: ptr :: without_provenance_mut ( val) , order) . cast ( ) }
2294
+ unsafe { atomic_add ( self . p . get ( ) , val, order) . cast ( ) }
2295
2295
}
2296
2296
2297
2297
/// Offsets the pointer's address by subtracting `val` *bytes*, returning the
@@ -2316,17 +2316,18 @@ impl<T> AtomicPtr<T> {
2316
2316
/// #![feature(strict_provenance_atomic_ptr)]
2317
2317
/// use core::sync::atomic::{AtomicPtr, Ordering};
2318
2318
///
2319
- /// let atom = AtomicPtr::<i64>::new(core::ptr::without_provenance_mut(1));
2320
- /// assert_eq!(atom.fetch_byte_sub(1, Ordering::Relaxed).addr(), 1);
2321
- /// assert_eq!(atom.load(Ordering::Relaxed).addr(), 0);
2319
+ /// let mut arr = [0i64, 1];
2320
+ /// let atom = AtomicPtr::<i64>::new(&raw mut arr[1]);
2321
+ /// assert_eq!(atom.fetch_byte_sub(8, Ordering::Relaxed).addr(), (&raw const arr[1]).addr());
2322
+ /// assert_eq!(atom.load(Ordering::Relaxed).addr(), (&raw const arr[0]).addr());
2322
2323
/// ```
2323
2324
#[ inline]
2324
2325
#[ cfg( target_has_atomic = "ptr" ) ]
2325
2326
#[ unstable( feature = "strict_provenance_atomic_ptr" , issue = "99108" ) ]
2326
2327
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
2327
2328
pub fn fetch_byte_sub ( & self , val : usize , order : Ordering ) -> * mut T {
2328
2329
// SAFETY: data races are prevented by atomic intrinsics.
2329
- unsafe { atomic_sub ( self . p . get ( ) , core :: ptr :: without_provenance_mut ( val) , order) . cast ( ) }
2330
+ unsafe { atomic_sub ( self . p . get ( ) , val, order) . cast ( ) }
2330
2331
}
2331
2332
2332
2333
/// Performs a bitwise "or" operation on the address of the current pointer,
@@ -2377,7 +2378,7 @@ impl<T> AtomicPtr<T> {
2377
2378
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
2378
2379
pub fn fetch_or ( & self , val : usize , order : Ordering ) -> * mut T {
2379
2380
// SAFETY: data races are prevented by atomic intrinsics.
2380
- unsafe { atomic_or ( self . p . get ( ) , core :: ptr :: without_provenance_mut ( val) , order) . cast ( ) }
2381
+ unsafe { atomic_or ( self . p . get ( ) , val, order) . cast ( ) }
2381
2382
}
2382
2383
2383
2384
/// Performs a bitwise "and" operation on the address of the current
@@ -2427,7 +2428,7 @@ impl<T> AtomicPtr<T> {
2427
2428
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
2428
2429
pub fn fetch_and ( & self , val : usize , order : Ordering ) -> * mut T {
2429
2430
// SAFETY: data races are prevented by atomic intrinsics.
2430
- unsafe { atomic_and ( self . p . get ( ) , core :: ptr :: without_provenance_mut ( val) , order) . cast ( ) }
2431
+ unsafe { atomic_and ( self . p . get ( ) , val, order) . cast ( ) }
2431
2432
}
2432
2433
2433
2434
/// Performs a bitwise "xor" operation on the address of the current
@@ -2475,7 +2476,7 @@ impl<T> AtomicPtr<T> {
2475
2476
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
2476
2477
pub fn fetch_xor ( & self , val : usize , order : Ordering ) -> * mut T {
2477
2478
// SAFETY: data races are prevented by atomic intrinsics.
2478
- unsafe { atomic_xor ( self . p . get ( ) , core :: ptr :: without_provenance_mut ( val) , order) . cast ( ) }
2479
+ unsafe { atomic_xor ( self . p . get ( ) , val, order) . cast ( ) }
2479
2480
}
2480
2481
2481
2482
/// Returns a mutable pointer to the underlying pointer.
@@ -3975,15 +3976,15 @@ unsafe fn atomic_swap<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
3975
3976
#[ inline]
3976
3977
#[ cfg( target_has_atomic) ]
3977
3978
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
3978
- unsafe fn atomic_add < T : Copy > ( dst : * mut T , val : T , order : Ordering ) -> T {
3979
+ unsafe fn atomic_add < T : Copy , U : Copy > ( dst : * mut T , val : U , order : Ordering ) -> T {
3979
3980
// SAFETY: the caller must uphold the safety contract for `atomic_add`.
3980
3981
unsafe {
3981
3982
match order {
3982
- Relaxed => intrinsics:: atomic_xadd :: < T , { AO :: Relaxed } > ( dst, val) ,
3983
- Acquire => intrinsics:: atomic_xadd :: < T , { AO :: Acquire } > ( dst, val) ,
3984
- Release => intrinsics:: atomic_xadd :: < T , { AO :: Release } > ( dst, val) ,
3985
- AcqRel => intrinsics:: atomic_xadd :: < T , { AO :: AcqRel } > ( dst, val) ,
3986
- SeqCst => intrinsics:: atomic_xadd :: < T , { AO :: SeqCst } > ( dst, val) ,
3983
+ Relaxed => intrinsics:: atomic_xadd :: < T , U , { AO :: Relaxed } > ( dst, val) ,
3984
+ Acquire => intrinsics:: atomic_xadd :: < T , U , { AO :: Acquire } > ( dst, val) ,
3985
+ Release => intrinsics:: atomic_xadd :: < T , U , { AO :: Release } > ( dst, val) ,
3986
+ AcqRel => intrinsics:: atomic_xadd :: < T , U , { AO :: AcqRel } > ( dst, val) ,
3987
+ SeqCst => intrinsics:: atomic_xadd :: < T , U , { AO :: SeqCst } > ( dst, val) ,
3987
3988
}
3988
3989
}
3989
3990
}
@@ -3992,15 +3993,15 @@ unsafe fn atomic_add<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
3992
3993
#[ inline]
3993
3994
#[ cfg( target_has_atomic) ]
3994
3995
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
3995
- unsafe fn atomic_sub < T : Copy > ( dst : * mut T , val : T , order : Ordering ) -> T {
3996
+ unsafe fn atomic_sub < T : Copy , U : Copy > ( dst : * mut T , val : U , order : Ordering ) -> T {
3996
3997
// SAFETY: the caller must uphold the safety contract for `atomic_sub`.
3997
3998
unsafe {
3998
3999
match order {
3999
- Relaxed => intrinsics:: atomic_xsub :: < T , { AO :: Relaxed } > ( dst, val) ,
4000
- Acquire => intrinsics:: atomic_xsub :: < T , { AO :: Acquire } > ( dst, val) ,
4001
- Release => intrinsics:: atomic_xsub :: < T , { AO :: Release } > ( dst, val) ,
4002
- AcqRel => intrinsics:: atomic_xsub :: < T , { AO :: AcqRel } > ( dst, val) ,
4003
- SeqCst => intrinsics:: atomic_xsub :: < T , { AO :: SeqCst } > ( dst, val) ,
4000
+ Relaxed => intrinsics:: atomic_xsub :: < T , U , { AO :: Relaxed } > ( dst, val) ,
4001
+ Acquire => intrinsics:: atomic_xsub :: < T , U , { AO :: Acquire } > ( dst, val) ,
4002
+ Release => intrinsics:: atomic_xsub :: < T , U , { AO :: Release } > ( dst, val) ,
4003
+ AcqRel => intrinsics:: atomic_xsub :: < T , U , { AO :: AcqRel } > ( dst, val) ,
4004
+ SeqCst => intrinsics:: atomic_xsub :: < T , U , { AO :: SeqCst } > ( dst, val) ,
4004
4005
}
4005
4006
}
4006
4007
}
@@ -4141,63 +4142,63 @@ unsafe fn atomic_compare_exchange_weak<T: Copy>(
4141
4142
#[ inline]
4142
4143
#[ cfg( target_has_atomic) ]
4143
4144
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
4144
- unsafe fn atomic_and < T : Copy > ( dst : * mut T , val : T , order : Ordering ) -> T {
4145
+ unsafe fn atomic_and < T : Copy , U : Copy > ( dst : * mut T , val : U , order : Ordering ) -> T {
4145
4146
// SAFETY: the caller must uphold the safety contract for `atomic_and`
4146
4147
unsafe {
4147
4148
match order {
4148
- Relaxed => intrinsics:: atomic_and :: < T , { AO :: Relaxed } > ( dst, val) ,
4149
- Acquire => intrinsics:: atomic_and :: < T , { AO :: Acquire } > ( dst, val) ,
4150
- Release => intrinsics:: atomic_and :: < T , { AO :: Release } > ( dst, val) ,
4151
- AcqRel => intrinsics:: atomic_and :: < T , { AO :: AcqRel } > ( dst, val) ,
4152
- SeqCst => intrinsics:: atomic_and :: < T , { AO :: SeqCst } > ( dst, val) ,
4149
+ Relaxed => intrinsics:: atomic_and :: < T , U , { AO :: Relaxed } > ( dst, val) ,
4150
+ Acquire => intrinsics:: atomic_and :: < T , U , { AO :: Acquire } > ( dst, val) ,
4151
+ Release => intrinsics:: atomic_and :: < T , U , { AO :: Release } > ( dst, val) ,
4152
+ AcqRel => intrinsics:: atomic_and :: < T , U , { AO :: AcqRel } > ( dst, val) ,
4153
+ SeqCst => intrinsics:: atomic_and :: < T , U , { AO :: SeqCst } > ( dst, val) ,
4153
4154
}
4154
4155
}
4155
4156
}
4156
4157
4157
4158
#[ inline]
4158
4159
#[ cfg( target_has_atomic) ]
4159
4160
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
4160
- unsafe fn atomic_nand < T : Copy > ( dst : * mut T , val : T , order : Ordering ) -> T {
4161
+ unsafe fn atomic_nand < T : Copy , U : Copy > ( dst : * mut T , val : U , order : Ordering ) -> T {
4161
4162
// SAFETY: the caller must uphold the safety contract for `atomic_nand`
4162
4163
unsafe {
4163
4164
match order {
4164
- Relaxed => intrinsics:: atomic_nand :: < T , { AO :: Relaxed } > ( dst, val) ,
4165
- Acquire => intrinsics:: atomic_nand :: < T , { AO :: Acquire } > ( dst, val) ,
4166
- Release => intrinsics:: atomic_nand :: < T , { AO :: Release } > ( dst, val) ,
4167
- AcqRel => intrinsics:: atomic_nand :: < T , { AO :: AcqRel } > ( dst, val) ,
4168
- SeqCst => intrinsics:: atomic_nand :: < T , { AO :: SeqCst } > ( dst, val) ,
4165
+ Relaxed => intrinsics:: atomic_nand :: < T , U , { AO :: Relaxed } > ( dst, val) ,
4166
+ Acquire => intrinsics:: atomic_nand :: < T , U , { AO :: Acquire } > ( dst, val) ,
4167
+ Release => intrinsics:: atomic_nand :: < T , U , { AO :: Release } > ( dst, val) ,
4168
+ AcqRel => intrinsics:: atomic_nand :: < T , U , { AO :: AcqRel } > ( dst, val) ,
4169
+ SeqCst => intrinsics:: atomic_nand :: < T , U , { AO :: SeqCst } > ( dst, val) ,
4169
4170
}
4170
4171
}
4171
4172
}
4172
4173
4173
4174
#[ inline]
4174
4175
#[ cfg( target_has_atomic) ]
4175
4176
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
4176
- unsafe fn atomic_or < T : Copy > ( dst : * mut T , val : T , order : Ordering ) -> T {
4177
+ unsafe fn atomic_or < T : Copy , U : Copy > ( dst : * mut T , val : U , order : Ordering ) -> T {
4177
4178
// SAFETY: the caller must uphold the safety contract for `atomic_or`
4178
4179
unsafe {
4179
4180
match order {
4180
- SeqCst => intrinsics:: atomic_or :: < T , { AO :: SeqCst } > ( dst, val) ,
4181
- Acquire => intrinsics:: atomic_or :: < T , { AO :: Acquire } > ( dst, val) ,
4182
- Release => intrinsics:: atomic_or :: < T , { AO :: Release } > ( dst, val) ,
4183
- AcqRel => intrinsics:: atomic_or :: < T , { AO :: AcqRel } > ( dst, val) ,
4184
- Relaxed => intrinsics:: atomic_or :: < T , { AO :: Relaxed } > ( dst, val) ,
4181
+ SeqCst => intrinsics:: atomic_or :: < T , U , { AO :: SeqCst } > ( dst, val) ,
4182
+ Acquire => intrinsics:: atomic_or :: < T , U , { AO :: Acquire } > ( dst, val) ,
4183
+ Release => intrinsics:: atomic_or :: < T , U , { AO :: Release } > ( dst, val) ,
4184
+ AcqRel => intrinsics:: atomic_or :: < T , U , { AO :: AcqRel } > ( dst, val) ,
4185
+ Relaxed => intrinsics:: atomic_or :: < T , U , { AO :: Relaxed } > ( dst, val) ,
4185
4186
}
4186
4187
}
4187
4188
}
4188
4189
4189
4190
#[ inline]
4190
4191
#[ cfg( target_has_atomic) ]
4191
4192
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
4192
- unsafe fn atomic_xor < T : Copy > ( dst : * mut T , val : T , order : Ordering ) -> T {
4193
+ unsafe fn atomic_xor < T : Copy , U : Copy > ( dst : * mut T , val : U , order : Ordering ) -> T {
4193
4194
// SAFETY: the caller must uphold the safety contract for `atomic_xor`
4194
4195
unsafe {
4195
4196
match order {
4196
- SeqCst => intrinsics:: atomic_xor :: < T , { AO :: SeqCst } > ( dst, val) ,
4197
- Acquire => intrinsics:: atomic_xor :: < T , { AO :: Acquire } > ( dst, val) ,
4198
- Release => intrinsics:: atomic_xor :: < T , { AO :: Release } > ( dst, val) ,
4199
- AcqRel => intrinsics:: atomic_xor :: < T , { AO :: AcqRel } > ( dst, val) ,
4200
- Relaxed => intrinsics:: atomic_xor :: < T , { AO :: Relaxed } > ( dst, val) ,
4197
+ SeqCst => intrinsics:: atomic_xor :: < T , U , { AO :: SeqCst } > ( dst, val) ,
4198
+ Acquire => intrinsics:: atomic_xor :: < T , U , { AO :: Acquire } > ( dst, val) ,
4199
+ Release => intrinsics:: atomic_xor :: < T , U , { AO :: Release } > ( dst, val) ,
4200
+ AcqRel => intrinsics:: atomic_xor :: < T , U , { AO :: AcqRel } > ( dst, val) ,
4201
+ Relaxed => intrinsics:: atomic_xor :: < T , U , { AO :: Relaxed } > ( dst, val) ,
4201
4202
}
4202
4203
}
4203
4204
}
0 commit comments