@@ -196,7 +196,7 @@ T atomicFetchSub(MemoryOrder ms = MemoryOrder.seq, T)(ref T val, size_t mod) pur
196
196
in (atomicValueIsProperlyAligned(val))
197
197
{
198
198
static if (is (T == U* , U))
199
- return cast (T)core.internal.atomic.atomicFetchAdd ! ms(cast (size_t * )&val, mod * U.sizeof);
199
+ return cast (T)core.internal.atomic.atomicFetchSub ! ms(cast (size_t * )&val, mod * U.sizeof);
200
200
else
201
201
return core.internal.atomic.atomicFetchSub ! ms(&val, cast (T)mod);
202
202
}
@@ -1143,6 +1143,29 @@ version (CoreUnittest)
1143
1143
}
1144
1144
}
1145
1145
1146
+ @betterC pure nothrow @nogc unittest
1147
+ {
1148
+ byte [10 ] byteArray = [1 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , 19 ];
1149
+ ulong [10 ] ulongArray = [2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 19 , 20 ];
1150
+
1151
+ {
1152
+ auto array = byteArray;
1153
+ byte * ptr = &array[0 ];
1154
+ byte * prevPtr = atomicFetchAdd(ptr, 3 );
1155
+ assert (prevPtr == &array[0 ]);
1156
+ assert (* prevPtr == 1 );
1157
+ assert (* ptr == 7 );
1158
+ }
1159
+ {
1160
+ auto array = ulongArray;
1161
+ ulong * ptr = &array[0 ];
1162
+ ulong * prevPtr = atomicFetchAdd(ptr, 3 );
1163
+ assert (prevPtr == &array[0 ]);
1164
+ assert (* prevPtr == 2 );
1165
+ assert (* ptr == 8 );
1166
+ }
1167
+ }
1168
+
1146
1169
@betterC pure nothrow @nogc @safe unittest
1147
1170
{
1148
1171
shared ubyte u8 = 1 ;
@@ -1167,6 +1190,29 @@ version (CoreUnittest)
1167
1190
}
1168
1191
}
1169
1192
1193
+ @betterC pure nothrow @nogc unittest
1194
+ {
1195
+ byte [10 ] byteArray = [1 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , 19 ];
1196
+ ulong [10 ] ulongArray = [2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 19 , 20 ];
1197
+
1198
+ {
1199
+ auto array = byteArray;
1200
+ byte * ptr = &array[5 ];
1201
+ byte * prevPtr = atomicFetchSub(ptr, 4 );
1202
+ assert (prevPtr == &array[5 ]);
1203
+ assert (* prevPtr == 11 );
1204
+ assert (* ptr == 3 ); // https://issues.dlang.org/show_bug.cgi?id=21578
1205
+ }
1206
+ {
1207
+ auto array = ulongArray;
1208
+ ulong * ptr = &array[5 ];
1209
+ ulong * prevPtr = atomicFetchSub(ptr, 4 );
1210
+ assert (prevPtr == &array[5 ]);
1211
+ assert (* prevPtr == 12 );
1212
+ assert (* ptr == 4 ); // https://issues.dlang.org/show_bug.cgi?id=21578
1213
+ }
1214
+ }
1215
+
1170
1216
@betterC pure nothrow @nogc @safe unittest // issue 16651
1171
1217
{
1172
1218
shared ulong a = 2 ;
0 commit comments