@@ -2930,7 +2930,7 @@ void destroy(T)(T obj) if (is(T == class))
2930
2930
{
2931
2931
static if (__traits(getLinkage, T) == " C++" )
2932
2932
{
2933
- obj.__dtor ();
2933
+ obj.__xdtor ();
2934
2934
2935
2935
enum classSize = __traits(classInstanceSize, T);
2936
2936
(cast (void * )obj)[0 .. classSize] = typeid (T).initializer[];
@@ -2950,38 +2950,66 @@ unittest
2950
2950
{
2951
2951
class C
2952
2952
{
2953
+ struct Agg
2954
+ {
2955
+ static int dtorCount;
2956
+
2957
+ int x = 10 ;
2958
+ ~this () { dtorCount++ ; }
2959
+ }
2960
+
2953
2961
static int dtorCount;
2954
2962
2955
2963
string s = " S" ;
2964
+ Agg a;
2956
2965
~this () { dtorCount++ ; }
2957
2966
}
2958
2967
2959
2968
C c = new C();
2960
- assert (c.dtorCount == 0 ); // destructor not yet called
2961
- assert (c.s == " S" ); // initial state `c.s` is `"S"`
2969
+ assert (c.dtorCount == 0 ); // destructor not yet called
2970
+ assert (c.s == " S" ); // initial state `c.s` is `"S"`
2971
+ assert (c.a.dtorCount == 0 ); // destructor not yet called
2972
+ assert (c.a.x == 10 ); // initial state `c.a.x` is `10`
2962
2973
c.s = " T" ;
2963
- assert (c.s == " T" ); // `c.s` is `"T"`
2974
+ c.a.x = 30 ;
2975
+ assert (c.s == " T" ); // `c.s` is `"T"`
2964
2976
destroy (c);
2965
- assert (c.dtorCount == 1 ); // `c`'s destructor was called
2966
- assert (c.s == " S" ); // `c.s` is back to its inital state, `"S"`
2977
+ assert (c.dtorCount == 1 ); // `c`'s destructor was called
2978
+ assert (c.s == " S" ); // `c.s` is back to its inital state, `"S"`
2979
+ assert (c.a.dtorCount == 1 ); // `c.a`'s destructor was called
2980
+ assert (c.a.x == 10 ); // `c.a.x` is back to its inital state, `10`
2967
2981
2968
2982
// check C++ classes work too!
2969
2983
extern (C++ ) class CPP
2970
2984
{
2985
+ struct Agg
2986
+ {
2987
+ __gshared int dtorCount;
2988
+
2989
+ int x = 10 ;
2990
+ ~this () { dtorCount++ ; }
2991
+ }
2992
+
2971
2993
__gshared int dtorCount;
2972
2994
2973
2995
string s = " S" ;
2996
+ Agg a;
2974
2997
~this () { dtorCount++ ; }
2975
2998
}
2976
2999
2977
3000
CPP cpp = new CPP ();
2978
- assert (cpp.dtorCount == 0 ); // destructor not yet called
2979
- assert (cpp.s == " S" ); // initial state `c.s` is `"S"`
3001
+ assert (cpp.dtorCount == 0 ); // destructor not yet called
3002
+ assert (cpp.s == " S" ); // initial state `cpp.s` is `"S"`
3003
+ assert (cpp.a.dtorCount == 0 ); // destructor not yet called
3004
+ assert (cpp.a.x == 10 ); // initial state `cpp.a.x` is `10`
2980
3005
cpp.s = " T" ;
2981
- assert (cpp.s == " T" ); // `c.s` is `"T"`
3006
+ cpp.a.x = 30 ;
3007
+ assert (cpp.s == " T" ); // `cpp.s` is `"T"`
2982
3008
destroy (cpp);
2983
- assert (cpp.dtorCount == 1 ); // `c`'s destructor was called
2984
- assert (cpp.s == " S" ); // `c.s` is back to its inital state, `"S"`
3009
+ assert (cpp.dtorCount == 1 ); // `cpp`'s destructor was called
3010
+ assert (cpp.s == " S" ); // `cpp.s` is back to its inital state, `"S"`
3011
+ assert (cpp.a.dtorCount == 1 ); // `cpp.a`'s destructor was called
3012
+ assert (cpp.a.x == 10 ); // `cpp.a.x` is back to its inital state, `10`
2985
3013
}
2986
3014
2987
3015
// / Value type demonstration
0 commit comments