@@ -509,7 +509,26 @@ macro_rules! atomic_bool_methods {
509509}
510510
511511macro_rules! ptr_atomic_methods {
512- ( $at_ty: ty, $rust_ty: ty, $value_ty: ty) => {
512+ ( $at_ty: ty, $rust_ty: ty, $value_ty: ty, $width: literal) => {
513+ // `from_ptr` requires alignment to `$rust_ty`; the caller holds a
514+ // `PointsTo<$value_ty>`, which guarantees only `align_of::<$value_ty>()`
515+ // (`PointsTo::is_aligned`). `target_has_atomic_primitive_alignment` is
516+ // rustc's name for those two being equal at a given width, so define
517+ // these only where it holds.
518+ #[ cfg( target_has_atomic_primitive_alignment = $width) ]
519+ const _: ( ) = assert!(
520+ core:: mem:: align_of:: <$value_ty>( ) == core:: mem:: align_of:: <$rust_ty>( ) ,
521+ concat!(
522+ stringify!( $at_ty) ,
523+ ": align_of::<" ,
524+ stringify!( $value_ty) ,
525+ ">() differs from align_of::<" ,
526+ stringify!( $rust_ty) ,
527+ ">() on this target" ,
528+ )
529+ ) ;
530+
531+ #[ cfg( target_has_atomic_primitive_alignment = $width) ]
513532 verus!{
514533 impl $at_ty {
515534 /// Store a value via a raw pointer using atomic store.
@@ -581,20 +600,20 @@ macro_rules! ptr_atomic_methods {
581600}
582601
583602#[ cfg( target_has_atomic = "64" ) ]
584- ptr_atomic_methods ! ( PAtomicU64 , AtomicU64 , u64 ) ;
603+ ptr_atomic_methods ! ( PAtomicU64 , AtomicU64 , u64 , "64" ) ;
585604
586- ptr_atomic_methods ! ( PAtomicU32 , AtomicU32 , u32 ) ;
587- ptr_atomic_methods ! ( PAtomicU16 , AtomicU16 , u16 ) ;
588- ptr_atomic_methods ! ( PAtomicU8 , AtomicU8 , u8 ) ;
589- ptr_atomic_methods ! ( PAtomicUsize , AtomicUsize , usize ) ;
605+ ptr_atomic_methods ! ( PAtomicU32 , AtomicU32 , u32 , "32" ) ;
606+ ptr_atomic_methods ! ( PAtomicU16 , AtomicU16 , u16 , "16" ) ;
607+ ptr_atomic_methods ! ( PAtomicU8 , AtomicU8 , u8 , "8" ) ;
608+ ptr_atomic_methods ! ( PAtomicUsize , AtomicUsize , usize , "ptr" ) ;
590609
591610#[ cfg( target_has_atomic = "64" ) ]
592- ptr_atomic_methods ! ( PAtomicI64 , AtomicI64 , i64 ) ;
611+ ptr_atomic_methods ! ( PAtomicI64 , AtomicI64 , i64 , "64" ) ;
593612
594- ptr_atomic_methods ! ( PAtomicI32 , AtomicI32 , i32 ) ;
595- ptr_atomic_methods ! ( PAtomicI16 , AtomicI16 , i16 ) ;
596- ptr_atomic_methods ! ( PAtomicI8 , AtomicI8 , i8 ) ;
597- ptr_atomic_methods ! ( PAtomicIsize , AtomicIsize , isize ) ;
613+ ptr_atomic_methods ! ( PAtomicI32 , AtomicI32 , i32 , "32" ) ;
614+ ptr_atomic_methods ! ( PAtomicI16 , AtomicI16 , i16 , "16" ) ;
615+ ptr_atomic_methods ! ( PAtomicI8 , AtomicI8 , i8 , "8" ) ;
616+ ptr_atomic_methods ! ( PAtomicIsize , AtomicIsize , isize , "ptr" ) ;
598617
599618make_bool_atomic ! ( PAtomicBool , PermissionBool , PermissionDataBool , AtomicBool , bool ) ;
600619
0 commit comments