@@ -5,9 +5,9 @@ $(CHANGELOG_NAV_INJECT)
55$(VERSION Feb 01, 2024, =================================================,
66
77$(CHANGELOG_HEADER_STATISTICS
8- $(VER) comes with 9 major changes and 52 fixed Bugzilla issues.
8+ $(VER) comes with 10 major changes and 61 fixed Bugzilla issues.
99 A huge thanks goes to the
10- $(LINK2 #contributors, 35 contributors)
10+ $(LINK2 #contributors, 37 contributors)
1111 who made $(VER) possible.)
1212
1313$(BUGSTITLE_TEXT_HEADER Compiler changes,
@@ -22,6 +22,7 @@ $(LI $(RELATIVE_LINK2 dmd.template-_d_newarratmT,`_d_newarray{mTX,miTX,OpT}` are
2222
2323$(BUGSTITLE_TEXT_HEADER Runtime changes,
2424
25+ $(LI $(RELATIVE_LINK2 druntime.coreatomic,Using an invalid MemoryOrder for `core.atomic` operations are now rejected at compile time))
2526$(LI $(RELATIVE_LINK2 druntime.makefiles,Makefiles cleanup for druntime))
2627$(LI $(RELATIVE_LINK2 druntime.stdatomic,New addition of the C stdatomic header implemented in D))
2728
@@ -172,6 +173,105 @@ This change adds the new template to `core.internal.array.construction`.
172173
173174$(BUGSTITLE_TEXT_BODY Runtime changes,
174175
176+ $(LI $(LNAME2 druntime.coreatomic,Using an invalid MemoryOrder for `core.atomic` operations are now rejected at compile time)
177+ $(CHANGELOG_SOURCE_FILE dmd, changelog/druntime.coreatomic.dd)
178+ $(P
179+ The following `core.atomic` functions have become more restrictive:
180+ )
181+
182+ $(P
183+ 1. `atomicLoad` and `atomicStore` now reject being instantiated with the
184+ argument `MemoryOrder.acq_rel`. Previously `atomicLoad` and `atomicStore` only
185+ rejected `MemoryOrder.rel` and `MemoryOrder.acq` respectively.
186+ )
187+
188+ $(P
189+ In most cases, code that previously used `MemoryOrder.acq_rel` should switch to
190+ use `MemoryOrder.seq` instead.
191+ )
192+
193+ ---
194+ // Error:
195+ atomicLoad!(MemoryOrder.acq_rel)(src);
196+ atomicStore!(MemoryOrder.acq_rel)(dest, value);
197+
198+ // Corrective action:
199+ atomicLoad!(MemoryOrder.seq)(src);
200+ atomicStore!(MemoryOrder.seq)(dest, value);
201+
202+ // Or:
203+ atomicLoad(src);
204+ atomicStore(dest, value);
205+ ---
206+
207+ $(P
208+ 2. `atomicExchange` now rejects being instantiated with the argument
209+ `MemoryOrder.acq`.
210+ )
211+
212+ $(P
213+ In most cases, code that previously used `MemoryOrder.acq` should switch to use
214+ `MemoryOrder.seq` instead.
215+ )
216+
217+ ---
218+ // Error:
219+ atomicExchange!(MemoryOrder.acq)(dest, value);
220+
221+ // Corrective action:
222+ atomicExchange!(MemoryOrder.seq)(dest, value);
223+
224+ // Or:
225+ atomicExchange(dest, value);
226+ ---
227+
228+ $(P
229+ 3. `atomicCompareExchangeWeak` and `atomicCompareExchangeStrong` now reject
230+ being instantiated when the second `fail` argument is `MemoryOrder.rel` or
231+ `MemoryOrder.acq_rel`.
232+ )
233+
234+ $(P
235+ In most cases, code that previously used either of these should switch to use
236+ `MemoryOrder.raw` instead.
237+ )
238+
239+ ---
240+ // Error:
241+ atomicExchangeWeak!(MemoryOrder.rel, MemoryOrder.rel)(dest, compare, value);
242+ atomicExchangeWeakNoResult!(MemoryOrder.acq_rel, MemoryOrder.acq_rel)(dest, compare, value);
243+ atomicExchangeStrong!(MemoryOrder.acq, MemoryOrder.rel)(dest, compare, value);
244+ atomicExchangeStrongNoResult!(MemoryOrder.seq, MemoryOrder.acq_rel)(dest, compare, value);
245+
246+ // Corrective action:
247+ atomicExchangeWeak!(MemoryOrder.rel, MemoryOrder.raw)(dest, compare, value);
248+ atomicExchangeWeakNoResult!(MemoryOrder.acq_rel, MemoryOrder.raw)(dest, compare, value);
249+ atomicExchangeStrong!(MemoryOrder.acq, MemoryOrder.raw)(dest, compare, value);
250+ atomicExchangeStrongNoResult!(MemoryOrder.seq, MemoryOrder.raw)(dest, compare, value);
251+ ---
252+
253+ $(P
254+ 4. `atomicCompareExchangeWeak` and `atomicCompareExchangeStrong` additionally
255+ now reject being instantiated when the second `fail` argument has a greater
256+ value than its first `succ` argument.
257+ )
258+
259+ $(P
260+ In most cases, code that violates this contract should use the same MemoryOrder
261+ for both `succ` and `fail` arguments.
262+ )
263+
264+ ---
265+ // Error:
266+ atomicExchangeWeak!(MemoryOrder.raw)(dest, compare, value);
267+ atomicExchangeStrong!(MemoryOrder.acq, MemoryOrder.seq)(dest, compare, value);
268+
269+ // Corrective action:
270+ atomicExchangeWeak!(MemoryOrder.raw, MemoryOrder.raw)(dest, compare, value);
271+ atomicExchangeStrong!(MemoryOrder.acq, MemoryOrder.acq)(dest, compare, value);
272+ ---
273+ )
274+
175275$(LI $(LNAME2 druntime.makefiles,Makefiles cleanup for druntime)
176276$(CHANGELOG_SOURCE_FILE dmd, changelog/druntime.makefiles.dd)
177277$(P
@@ -234,7 +334,9 @@ $(BUGSTITLE_BUGZILLA DMD Compiler regression fixes,
234334
235335$(LI $(BUGZILLA 24266): ImportC: struct initializer entry gets ignored)
236336$(LI $(BUGZILLA 24274): [REG master] ImportC: unrecognized C initializer with array in struct)
337+ $(LI $(BUGZILLA 24295): [betterC] ICE with new int[])
237338$(LI $(BUGZILLA 24301): [REG 2.100] Misleading error message when passing non-copyable struct by value in @safe code)
339+ $(LI $(BUGZILLA 24338): Cannot concatenate dynamic arrays of enum type with static array base type)
238340)
239341$(BUGSTITLE_BUGZILLA DMD Compiler bug fixes,
240342
@@ -252,6 +354,7 @@ $(LI $(BUGZILLA 24094): importC __declspec not working in front of declaration s
252354$(LI $(BUGZILLA 24200): ImportC: .di file collected macro conflicts with Special Token)
253355$(LI $(BUGZILLA 24224): __traits$(LPAREN)initSymbol$(RPAREN) treats aggregate-derived enum as base type)
254356$(LI $(BUGZILLA 24248): const constructor call with mutable target gives wrong error message)
357+ $(LI $(BUGZILLA 24252): ci: Error: error writing file 'compilable\testcstuff3_0.obj')
255358$(LI $(BUGZILLA 24264): ImportC: inliner trips on _Bool return)
256359$(LI $(BUGZILLA 24276): ImportC: typedef aliases not emitted correctly in .di files)
257360$(LI $(BUGZILLA 24280): ImportC: forward reference error when compiling multiple files)
@@ -261,6 +364,11 @@ $(LI $(BUGZILLA 24292): Struct with destructor wrongly returned in register)
261364$(LI $(BUGZILLA 24303): anonymous struct problems when typedef'd in separate C files)
262365$(LI $(BUGZILLA 24304): __uint16_t, __uint32_t, __uint64_t are not recognized)
263366$(LI $(BUGZILLA 24306): ImportC: same name structs in separate C files interfere when compiled together)
367+ $(LI $(BUGZILLA 24309): Memory allocation failed on Azure pipeline)
368+ $(LI $(BUGZILLA 24311): Named enum with AA base type causes ICE)
369+ $(LI $(BUGZILLA 24319): OpenBSD: Use correct type for file_time)
370+ $(LI $(BUGZILLA 24326): ImportC: segfault on nameless enum translation with -H)
371+ $(LI $(BUGZILLA 24340): Invalid export directives generated)
264372)
265373$(BUGSTITLE_BUGZILLA DMD Compiler enhancements,
266374
@@ -284,6 +392,7 @@ $(BUGSTITLE_BUGZILLA Phobos bug fixes,
284392$(LI $(BUGZILLA 24151): std.container.array: Array!string$(LPAREN)""$(RPAREN) does not compile)
285393$(LI $(BUGZILLA 24215): std.traits.isBasicType!Enum should be false)
286394$(LI $(BUGZILLA 24278): std.math.abs promotes unsigned argument to 32 bits)
395+ $(LI $(BUGZILLA 24342): T[][].until$(LPAREN)T[]$(RPAREN) breaks if sentinel is longer than 1.)
287396)
288397$(BUGSTITLE_BUGZILLA Phobos enhancements,
289398
@@ -313,11 +422,12 @@ $(LI $(BUGZILLA 24177): Array literal can implicitly convert to an expected type
313422$(LI $(BUGZILLA 24210): Function types are not documented)
314423)
315424)
316- $(D_CONTRIBUTORS_HEADER 35 )
425+ $(D_CONTRIBUTORS_HEADER 37 )
317426$(D_CONTRIBUTORS
318427 $(D_CONTRIBUTOR Adam D. Ruppe)
319428 $(D_CONTRIBUTOR Atila Neves)
320429 $(D_CONTRIBUTOR Basile Burg)
430+ $(D_CONTRIBUTOR Brian Callahan)
321431 $(D_CONTRIBUTOR Daniel Pflager)
322432 $(D_CONTRIBUTOR Danil Sidoruk)
323433 $(D_CONTRIBUTOR Denis Feklushkin)
@@ -347,6 +457,7 @@ $(D_CONTRIBUTORS
347457 $(D_CONTRIBUTOR Sönke Ludwig)
348458 $(D_CONTRIBUTOR Teodor Dutu)
349459 $(D_CONTRIBUTOR Tim Schendekehl)
460+ $(D_CONTRIBUTOR Timon Gehr)
350461 $(D_CONTRIBUTOR Walter Bright)
351462 $(D_CONTRIBUTOR Yang Yujie)
352463 $(D_CONTRIBUTOR Семён Марьясин)
0 commit comments