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