Skip to content

Commit 17dd56f

Browse files
committed
don't use memcmp() for small struct equality
1 parent ce18ded commit 17dd56f

4 files changed

Lines changed: 29 additions & 21 deletions

File tree

src/dmd/opover.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1241,7 +1241,7 @@ Expression op_overload(Expression e, Scope* sc)
12411241
return;
12421242

12431243
import dmd.clone : needOpEquals;
1244-
if (!needOpEquals(sd))
1244+
if (!needOpEquals(sd) && t1.size() > Type.tvoidptr.size() * 2)
12451245
{
12461246
// Use bitwise equality.
12471247
auto op2 = e.op == TOK.equal ? TOK.identity : TOK.notIdentity;

test/compilable/test16284.d

Lines changed: 0 additions & 18 deletions
This file was deleted.

test/fail_compilation/test16284.d

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* TEST_OUTPUT:
2+
---
3+
fail_compilation/test16284.d(23): Error: reinterpretation through overlapped field `s` is not allowed in CTFE
4+
fail_compilation/test16284.d(26): called from here: `test()`
5+
fail_compilation/test16284.d(26): while evaluating: `static assert(test())`
6+
---
7+
*/
8+
9+
// https://issues.dlang.org/show_bug.cgi?id=16284
10+
11+
struct S {}
12+
13+
struct T
14+
{
15+
union {int i; S s;}
16+
this(uint dummy) { s = S.init; }
17+
}
18+
19+
bool test()
20+
{
21+
auto t1 = T(0);
22+
auto t2 = T(0);
23+
return t1 == t2;
24+
}
25+
26+
static assert(test());

test/runnable/opover2.d

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ bool test3789()
728728
auto ua2 = UnionA([1,2,3]);
729729
assert(ua1.u.x is ua2.u.x);
730730
assert(ua1.u.x != ua2.u.x);
731-
assert(ua1 == ua2);
731+
assert(ua1 != ua2);
732732
ua1.u.x = 1.0;
733733
ua2.u.x = 1.0;
734734
assert(ua1.u.x is ua2.u.x);
@@ -755,7 +755,7 @@ bool test3789()
755755
ub2.u.a = [1,2,3].dup;
756756
assert(ub1.u.a !is ub2.u.a);
757757
assert(ub1.u.a == ub2.u.a);
758-
assert(ub1 != ub2);
758+
assert(ub1 == ub2);
759759
ub2.u.a = ub1.u.a;
760760
assert(ub1.u.a is ub2.u.a);
761761
assert(ub1.u.a == ub2.u.a);

0 commit comments

Comments
 (0)