Skip to content

Commit b3ffc53

Browse files
committed
Fix criterion when value classes have user defined equals methods
# Conflicts: # compiler/src/dotty/tools/dotc/transform/VCElideAllocations.scala
1 parent e77d2bc commit b3ffc53

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

compiler/src/dotty/tools/dotc/transform/VCElideAllocations.scala

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package transform
33

44
import ast.tpd
55
import core._
6-
import Contexts._, Symbols._
6+
import Contexts._, Symbols._, Types._, Flags._, Phases._
77
import DenotTransformers._, MegaPhase._
88
import TreeExtractors._, ValueClasses._
99

@@ -23,13 +23,18 @@ class VCElideAllocations extends MiniPhase with IdentityDenotTransformer {
2323
override def runsAfter: Set[String] = Set(ElimErasedValueType.name)
2424

2525
override def transformApply(tree: Apply)(using Context): Tree =
26+
def hasUserDefinedEquals(tp: Type): Boolean =
27+
val eql = atPhase(erasurePhase) {
28+
defn.Any_equals.matchingMember(tp.typeSymbol.thisType)
29+
}
30+
eql.owner != defn.AnyClass && !eql.is(Synthetic)
2631
tree match {
27-
// new V(u1) == new V(u2) => u1 == u2
32+
// new V(u1) == new V(u2) => u1 == u2, unless V defines its own equals.
2833
// (We don't handle != because it has been eliminated by InterceptedMethods)
2934
case BinaryOp(NewWithArgs(tp1, List(u1)), op, NewWithArgs(tp2, List(u2)))
30-
if (tp1 eq tp2) && (op eq defn.Any_==) &&
31-
isDerivedValueClass(tp1.typeSymbol) &&
32-
!defn.Any_equals.overridingSymbol(tp1.typeSymbol.asClass).exists =>
35+
if (tp1 eq tp2) && (op eq defn.Any_==)
36+
&& isDerivedValueClass(tp1.typeSymbol)
37+
&& !hasUserDefinedEquals(tp1) =>
3338
// == is overloaded in primitive classes
3439
u1.equal(u2)
3540

0 commit comments

Comments
 (0)