@@ -3870,9 +3870,28 @@ private extern(C++) final class IsMemcmpableVisitor : Visitor
3870
3870
public:
3871
3871
bool result = false;
3872
3872
3873
+ static Type loweredBaseElemOf(Type t)
3874
+ {
3875
+ t = t.baseElemOf(); // skip over static-array parents
3876
+ switch (t.ty)
3877
+ {
3878
+ case Tvoid:
3879
+ return Type.tuns8;
3880
+ case Tpointer:
3881
+ return Type.tsize_t;
3882
+ default:
3883
+ return t;
3884
+ }
3885
+ }
3886
+
3887
+ static bool isTriviallyMemcmpable(Type t)
3888
+ {
3889
+ return loweredBaseElemOf(t).isIntegral();
3890
+ }
3891
+
3873
3892
override void visit(Type t)
3874
3893
{
3875
- result = t.ty == Tvoid || (t.isScalar() && !t.isFloating() );
3894
+ result = isTriviallyMemcmpable(t );
3876
3895
}
3877
3896
3878
3897
override void visit(TypeStruct ts)
@@ -13510,15 +13529,20 @@ version (IN_LLVM)
13510
13529
{
13511
13530
Type t1n = t1.nextOf().toBasetype();
13512
13531
Type t2n = t2.nextOf().toBasetype();
13513
- const t1nsz = t1n.size();
13514
- const t2nsz = t2n.size();
13515
13532
13516
- if ((t1n.ty == Tvoid || (t1n.isScalar() && !t1n.isFloating())) &&
13517
- (t2n.ty == Tvoid || (t2n.isScalar() && !t1n.isFloating())) &&
13518
- t1nsz == t2nsz && t1n.isUnsigned() == t2n.isUnsigned())
13533
+ if (t1n.size() != t2n.size())
13534
+ return false;
13535
+
13536
+ if (IsMemcmpableVisitor.isTriviallyMemcmpable(t1n) &&
13537
+ IsMemcmpableVisitor.isTriviallyMemcmpable(t2n))
13519
13538
{
13520
- return true;
13539
+ // due to int promotion, disallow small integers of diverging signed-ness
13540
+ Type e1 = IsMemcmpableVisitor.loweredBaseElemOf(t1n);
13541
+ Type e2 = IsMemcmpableVisitor.loweredBaseElemOf(t2n);
13542
+ if ((e1.size() >= 4 && e2.size() >= 4) || e1.isUnsigned() == e2.isUnsigned())
13543
+ return true;
13521
13544
}
13545
+
13522
13546
if (t1n.constOf() != t2n.constOf())
13523
13547
{
13524
13548
return false;
@@ -13533,7 +13557,7 @@ version (IN_LLVM)
13533
13557
if (global.params.useTypeInfo && Type.dtypeinfo)
13534
13558
semanticTypeInfo(sc, ts);
13535
13559
13536
- auto v = new IsMemcmpableVisitor();
13560
+ scope v = new IsMemcmpableVisitor();
13537
13561
ts.accept(v);
13538
13562
return v.result;
13539
13563
}
0 commit comments