@@ -113,8 +113,11 @@ TailShared!T atomicLoad(MemoryOrder ms = MemoryOrder.seq, T)(ref shared const T
113113 * newval = The value to store.
114114 */
115115void 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 */
165168T 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 ))
167170in (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 */
194197T 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 ))
196199in (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 */
223226T 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 ))
225228in (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 ))
243246in (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 */
279282bool 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 ))
281284in (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 */
338341bool 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 ))
340343in (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*/
403406bool 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 ))
405408in (atomicPtrIsProperlyAligned(here), " Argument `here` is not properly aligned" )
406409{
407410 // resolve implicit conversions
0 commit comments