Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit a336e4d

Browse files
committed
Fix shared U, U, add assert on no elaborate copy.
1 parent fbf560c commit a336e4d

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

src/core/atomic.d

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,11 @@ TailShared!T atomicLoad(MemoryOrder ms = MemoryOrder.seq, T)(ref shared const T
113113
* newval = The value to store.
114114
*/
115115
void atomicStore(MemoryOrder ms = MemoryOrder.seq, T, V)(ref T val, V newval) pure nothrow @nogc @trusted
116-
if (!is(T == shared S, S) && !is(V == shared U, U))
116+
if (!is(T == shared) && !is(V == shared))
117117
{
118+
import core.internal.traits : hasElaborateCopyConstructor;
119+
static assert (!hasElaborateCopyConstructor!T, "`T` may not have an elaborate copy: atomic operations override regular copying semantics.");
120+
118121
// resolve implicit conversions
119122
T arg = newval;
120123

@@ -163,7 +166,7 @@ void atomicStore(MemoryOrder ms = MemoryOrder.seq, T, V)(ref shared T val, share
163166
* The value held previously by `val`.
164167
*/
165168
T atomicFetchAdd(MemoryOrder ms = MemoryOrder.seq, T)(ref T val, size_t mod) pure nothrow @nogc @trusted
166-
if ((__traits(isIntegral, T) || is(T == U*, U)) && !is(T == shared V, V))
169+
if ((__traits(isIntegral, T) || is(T == U*, U)) && !is(T == shared))
167170
in (atomicValueIsProperlyAligned(val))
168171
{
169172
static if (is(T == U*, U))
@@ -192,7 +195,7 @@ in (atomicValueIsProperlyAligned(val))
192195
* The value held previously by `val`.
193196
*/
194197
T atomicFetchSub(MemoryOrder ms = MemoryOrder.seq, T)(ref T val, size_t mod) pure nothrow @nogc @trusted
195-
if ((__traits(isIntegral, T) || is(T == U*, U)) && !is(T == shared U, U))
198+
if ((__traits(isIntegral, T) || is(T == U*, U)) && !is(T == shared))
196199
in (atomicValueIsProperlyAligned(val))
197200
{
198201
static if (is(T == U*, U))
@@ -221,7 +224,7 @@ in (atomicValueIsProperlyAligned(val))
221224
* The value held previously by `here`.
222225
*/
223226
T atomicExchange(MemoryOrder ms = MemoryOrder.seq,T,V)(T* here, V exchangeWith) pure nothrow @nogc @trusted
224-
if (!is(T == shared S, S) && !is(V == shared U, U))
227+
if (!is(T == shared) && !is(V == shared))
225228
in (atomicPtrIsProperlyAligned(here), "Argument `here` is not properly aligned")
226229
{
227230
// resolve implicit conversions
@@ -242,7 +245,7 @@ TailShared!T atomicExchange(MemoryOrder ms = MemoryOrder.seq,T,V)(shared(T)* her
242245
if (!is(T == class))
243246
in (atomicPtrIsProperlyAligned(here), "Argument `here` is not properly aligned")
244247
{
245-
static if (is (V == shared U, U))
248+
static if (is (V == shared))
246249
alias Thunk = U;
247250
else
248251
{
@@ -277,7 +280,7 @@ in (atomicPtrIsProperlyAligned(here), "Argument `here` is not properly aligned")
277280
* true if the store occurred, false if not.
278281
*/
279282
bool cas(MemoryOrder succ = MemoryOrder.seq,MemoryOrder fail = MemoryOrder.seq,T,V1,V2)(T* here, V1 ifThis, V2 writeThis) pure nothrow @nogc @trusted
280-
if (!is(T == shared S, S) && is(T : V1))
283+
if (!is(T == shared) && is(T : V1))
281284
in (atomicPtrIsProperlyAligned(here), "Argument `here` is not properly aligned")
282285
{
283286
// resolve implicit conversions
@@ -336,7 +339,7 @@ in (atomicPtrIsProperlyAligned(here), "Argument `here` is not properly aligned")
336339
* true if the store occurred, false if not.
337340
*/
338341
bool cas(MemoryOrder succ = MemoryOrder.seq,MemoryOrder fail = MemoryOrder.seq,T,V)(T* here, T* ifThis, V writeThis) pure nothrow @nogc @trusted
339-
if (!is(T == shared S, S) && !is(V == shared U, U))
342+
if (!is(T == shared) && !is(V == shared))
340343
in (atomicPtrIsProperlyAligned(here), "Argument `here` is not properly aligned")
341344
{
342345
// resolve implicit conversions
@@ -401,7 +404,7 @@ in (atomicPtrIsProperlyAligned(here), "Argument `here` is not properly aligned")
401404
* true if the store occurred, false if not.
402405
*/
403406
bool casWeak(MemoryOrder succ = MemoryOrder.seq,MemoryOrder fail = MemoryOrder.seq,T,V1,V2)(T* here, V1 ifThis, V2 writeThis) pure nothrow @nogc @trusted
404-
if (!is(T == shared S, S) && is(T : V1))
407+
if (!is(T == shared) && is(T : V1))
405408
in (atomicPtrIsProperlyAligned(here), "Argument `here` is not properly aligned")
406409
{
407410
// resolve implicit conversions

0 commit comments

Comments
 (0)