Skip to content

Commit b2f1bca

Browse files
committed
Fix alignment of trait parameters and arguments
As part of the fix, we now also detect missing trait constructors. Fixes #11214 Fixes #11344
1 parent e67fed3 commit b2f1bca

File tree

4 files changed

+15
-4
lines changed

4 files changed

+15
-4
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase =>
258258
&& !wasOneOf(getter, Deferred)
259259
&& !getter.isConstExprFinalVal
260260
yield
261-
if (isCurrent(getter) || getter.name.is(ExpandedName)) {
261+
if (isInImplementingClass(getter) || getter.name.is(ExpandedName)) {
262262
val rhs =
263263
if (wasOneOf(getter, ParamAccessor))
264264
nextArgument()
@@ -271,6 +271,9 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase =>
271271
// transformFollowing call is needed to make memoize & lazy vals run
272272
transformFollowing(DefDef(mkForwarderSym(getter.asTerm), rhs))
273273
}
274+
else if wasOneOf(getter, ParamAccessor) then
275+
// mixin parameter field is defined by an override; evaluate the argument and throw it away
276+
nextArgument()
274277
else EmptyTree
275278
}
276279

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class MixinOps(cls: ClassSymbol, thisPhase: DenotTransformer)(using Context) {
4242
/** Is `sym` a member of implementing class `cls`?
4343
* The test is performed at phase `thisPhase`.
4444
*/
45-
def isCurrent(sym: Symbol): Boolean =
45+
def isInImplementingClass(sym: Symbol): Boolean =
4646
atPhase(thisPhase) {
4747
cls.info.nonPrivateMember(sym.name).hasAltWith(_.symbol == sym)
4848
}
@@ -71,7 +71,7 @@ class MixinOps(cls: ClassSymbol, thisPhase: DenotTransformer)(using Context) {
7171
meth.is(Method, butNot = PrivateOrAccessorOrDeferred) &&
7272
(ctx.settings.mixinForwarderChoices.isTruthy || meth.owner.is(Scala2x) || needsDisambiguation || hasNonInterfaceDefinition ||
7373
generateJUnitForwarder || generateSerializationForwarder) &&
74-
isCurrent(meth)
74+
isInImplementingClass(meth)
7575
}
7676

7777
final val PrivateOrAccessor: FlagSet = Private | Accessor
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
trait Pet(val name: String)
22
trait FeatheredPet extends Pet
33

4-
class Bird(override val name: String) extends FeatheredPet:
4+
class Bird(override val name: String) extends FeatheredPet: // error
55
override def toString = s"bird name: $name"

tests/pos/i11344.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
trait Pet(val name: String, rest: Int):
2+
def f(suffix: String) = s"$name$suffix$rest"
3+
4+
class Birdie(override val name: String) extends Pet("huh", 1)
5+
6+
@main def Test =
7+
assert(Birdie("Polly").f("more") == "Pollymore1")
8+

0 commit comments

Comments
 (0)