From d56c203eba0f341e8d1e87271808113f4145a266 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Mon, 14 Feb 2022 16:37:39 +0100 Subject: [PATCH] Find inline calls inserted in synthetic members Fix #14442 --- .../dotty/tools/dotc/transform/SyntheticMembers.scala | 11 ++++++++++- tests/pos/i14442.scala | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 tests/pos/i14442.scala diff --git a/compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala b/compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala index 3a94a78b3d8e..4ce4619aa3b9 100644 --- a/compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala +++ b/compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala @@ -610,7 +610,16 @@ class SyntheticMembers(thisPhase: DenotTransformer) { def addSyntheticMembers(impl: Template)(using Context): Template = { val clazz = ctx.owner.asClass + val syntheticMembers = serializableObjectMethod(clazz) ::: serializableEnumValueMethod(clazz) ::: caseAndValueMethods(clazz) + checkInlining(syntheticMembers) addMirrorSupport( - cpy.Template(impl)(body = serializableObjectMethod(clazz) ::: serializableEnumValueMethod(clazz) ::: caseAndValueMethods(clazz) ::: impl.body)) + cpy.Template(impl)(body = syntheticMembers ::: impl.body)) } + + private def checkInlining(syntheticMembers: List[Tree])(using Context): Unit = + if syntheticMembers.exists(_.existsSubTree { + case tree: GenericApply => tree.symbol.isAllOf(InlineMethod) + case tree: Select => tree.symbol.isAllOf(InlineMethod) + case _ => false + }) then ctx.compilationUnit.needsInlining = true } diff --git a/tests/pos/i14442.scala b/tests/pos/i14442.scala new file mode 100644 index 000000000000..60d7e26a0b3f --- /dev/null +++ b/tests/pos/i14442.scala @@ -0,0 +1,4 @@ +class Foo(val id: Int) { + inline def ==(that: Foo): Boolean = true +} +case class FooWrapper(foo: Foo)