@@ -9299,29 +9299,14 @@ are no pointers to it. As such, it is illegal to move a scoped object.
92999299template  scoped (T)
93009300if  (is (T ==  class ))
93019301{
9302-     //  _d_newclass now use default GC alignment (looks like (void*).sizeof * 2 for
9303-     //  small objects). We will just use the maximum of filed alignments.
9304-     enum  alignment = __traits(classInstanceAlignment, T);
9305-     alias  aligned = _alignUp! alignment;
9306- 
93079302    static  struct  Scoped 
93089303    {
9309-         //  Addition of `alignment` is required as `Scoped_store` can be misaligned in memory. 
9310-         private   void [aligned( __traits(classInstanceSize, T)  +   size_t .sizeof)  +  alignment] Scoped_store  = void ;
9304+         private   align (__traits(classInstanceAlignment, T)) 
9305+              void [__traits(classInstanceSize, T)] buffer  = void ;
93119306
93129307        @property  inout (T) Scoped_payload() inout 
93139308        {
9314-             void *  alignedStore = cast (void * ) aligned(cast (size_t ) Scoped_store.ptr);
9315-             //  As `Scoped` can be unaligned moved in memory class instance should be moved accordingly.
9316-             immutable  size_t  d = alignedStore -  Scoped_store.ptr;
9317-             size_t *  currD = cast (size_t * ) &Scoped_store[$ -  size_t .sizeof];
9318-             if  (d !=  * currD)
9319-             {
9320-                 import  core.stdc.string  : memmove;
9321-                 memmove(alignedStore, Scoped_store.ptr +  * currD, __traits(classInstanceSize, T));
9322-                 * currD = d;
9323-             }
9324-             return  cast (inout (T)) alignedStore;
9309+             return  cast (inout (T)) buffer.ptr;
93259310        }
93269311        alias  Scoped_payload this ;
93279312
@@ -9330,9 +9315,7 @@ if (is(T == class))
93309315
93319316        ~this ()
93329317        {
9333-             //  `destroy` will also write .init but we have no functions in druntime
9334-             //  for deterministic finalization and memory releasing for now.
9335-             .destroy (Scoped_payload);
9318+             .destroy ! false (Scoped_payload);
93369319        }
93379320    }
93389321
@@ -9344,10 +9327,7 @@ if (is(T == class))
93449327        import  core.lifetime  : emplace, forward;
93459328
93469329        Scoped result = void ;
9347-         void *  alignedStore = cast (void * ) aligned(cast (size_t ) result.Scoped_store.ptr);
9348-         immutable  size_t  d = alignedStore -  result.Scoped_store.ptr;
9349-         * cast (size_t * ) &result.Scoped_store[$ -  size_t .sizeof] = d;
9350-         emplace! (Unqual! T)(result.Scoped_store[d ..  $ -  size_t .sizeof], forward! args);
9330+         emplace! (Unqual! T)(result.buffer, forward! args);
93519331        return  result;
93529332    }
93539333}
@@ -9434,13 +9414,6 @@ if (is(T == class))
94349414    destroy (* b2); //  calls A's destructor for b2.a
94359415}
94369416
9437- private  size_t  _alignUp (size_t  alignment)(size_t  n)
9438- if  (alignment >  0  &&  ! ((alignment -  1 ) & alignment))
9439- {
9440-     enum  badEnd = alignment -  1 ; //  0b11, 0b111, ...
9441-     return  (n +  badEnd) & ~ badEnd;
9442- }
9443- 
94449417//  https://issues.dlang.org/show_bug.cgi?id=6580 testcase
94459418@system  unittest 
94469419{
0 commit comments