@@ -119,27 +119,6 @@ struct mir_rcptr(T)
119119 mir_rc_increase_counter(context);
120120 }
121121 }
122-
123- static if (! is (T == interface ) && ! __traits(isAbstractClass, T))
124- {
125- package (mir) this (Args... )(auto ref Args args)
126- {
127- () @trusted {
128- _context = mir_rc_create(mir_get_type_info! T, 1 , mir_get_payload_ptr! T);
129- if (! _context)
130- {
131- version (D_Exceptions)
132- throw allocationError;
133- else
134- assert (0 , allocationExcMsg);
135- }
136- _value = cast (typeof (_value))(_context + 1 );
137- } ();
138- import core.lifetime : forward;
139- import mir.conv: emplace;
140- cast (void ) emplace! T(_value, forward! args);
141- }
142- }
143122}
144123
145124// /
@@ -220,15 +199,29 @@ mir_rcptr!(immutable R) castTo(R, T)(return immutable mir_rcptr!T context) @trus
220199 return createRCWithContext (cast (immutable R)context._get_value, move(* cast (mir_rcptr! T* )&context));
221200}
222201
223-
224202// /
225203template createRC (T)
204+ if (! is (T == interface ) && ! __traits(isAbstractClass, T))
226205{
227206 // /
228207 mir_rcptr! T createRC (Args... )(auto ref Args args)
229208 {
209+ typeof (return ) ret;
210+ with (ret) () @trusted {
211+ _context = mir_rc_create(mir_get_type_info! T, 1 , mir_get_payload_ptr! T);
212+ if (! _context)
213+ {
214+ version (D_Exceptions)
215+ throw allocationError;
216+ else
217+ assert (0 , allocationExcMsg);
218+ }
219+ _value = cast (typeof (_value))(_context + 1 );
220+ } ();
230221 import core.lifetime : forward;
231- return mir_rcptr! T(forward! args);
222+ import mir.conv: emplace;
223+ cast (void ) emplace! T(ret._value, forward! args);
224+ return ret;
232225 }
233226}
234227
@@ -244,6 +237,18 @@ unittest
244237 assert (* a == 100 );
245238}
246239
240+ // / Classes with empty constructor
241+ version (mir_test)
242+ @safe pure @nogc nothrow
243+ unittest
244+ {
245+ static class C
246+ {
247+ int index = 34 ;
248+ }
249+ assert (createRC! C.index == 34 );
250+ }
251+
247252// /
248253version (mir_test)
249254@safe pure @nogc nothrow
@@ -267,7 +272,6 @@ unittest
267272 assert (a._counter == 2 );
268273
269274 auto d = a.castTo! D; // RCPtr!D
270- import std.stdio ;
271275 assert (d._counter == 3 );
272276 d.index = 234 ;
273277 assert (a.index == 234 );
0 commit comments