Skip to content

Commit a17241e

Browse files
committed
Postblit is still a form of copy constructor
1 parent 011b7c6 commit a17241e

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

src/dmd/traits.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ Expression semanticTraits(TraitsExp e, Scope* sc)
621621
}
622622
else if (e.ident == Id.hasElaborateCopyConstructor)
623623
{
624-
return sd.hasCopyCtor ? True() : False();
624+
return sd.hasCopyCtor || sd.postblit !is null ? True() : False();
625625
}
626626
}
627627
return True();

test/compilable/traits.d

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,19 +112,24 @@ void foo(T)()
112112
static assert (__traits(hasElaborateCopyConstructor, S!int));
113113
}
114114

115-
struct U(T) {
115+
struct U(T)
116+
{
116117
this (ref U rhs) {}
117118
}
118119

119-
struct SPostblit {
120+
struct SPostblit
121+
{
120122
this(this) {}
121123
}
122124

125+
struct NoCpCtor { }
126+
123127
static assert(__traits(hasElaborateCopyConstructor, S));
124128
static assert(__traits(hasElaborateCopyConstructor, OuterS.S));
125129
static assert(__traits(compiles, foo!int));
126130
static assert(__traits(compiles, foo!S));
127131
static assert(__traits(hasElaborateCopyConstructor, U!int));
128132
static assert(__traits(hasElaborateCopyConstructor, U!S));
133+
static assert(__traits(hasElaborateCopyConstructor, SPostblit));
129134

130-
static assert(!__traits(hasElaborateCopyConstructor, SPostblit));
135+
static assert(!__traits(hasElaborateCopyConstructor, NoCpCtor));

0 commit comments

Comments
 (0)