Skip to content

Commit a664f52

Browse files
committed
Fix Mixin: remove Module flag in mixin synthesis
Module flag will cause the companion class defined in a trait to be incorrectly entered as a member of the class that implement the trait. The method `Symbol.entered` has the logic to enter the companion class: if (this.is(Module)) this.owner.asClass.enter(this.moduleClass) The following is a simple test case: trait A{ object O } class B extends A { def foo = O }
1 parent d91e42f commit a664f52

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class MixinOps(cls: ClassSymbol, thisPhase: DenotTransformer)(implicit ctx: Cont
2222
val res = member.copy(
2323
owner = cls,
2424
name = member.name.stripScala2LocalSuffix,
25-
flags = member.flags &~ Deferred | Synthetic | extraFlags,
25+
flags = member.flags &~ Deferred &~ Module | Synthetic | extraFlags,
2626
info = cls.thisType.memberInfo(member)).enteredAfter(thisPhase).asTerm
2727
res.addAnnotations(member.annotations.filter(_.symbol != defn.TailrecAnnot))
2828
res

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -427,18 +427,18 @@ class TreeChecker extends Phase with SymTransformer {
427427
checkOwner(impl.constr)
428428

429429
def isNonMagicalMember(x: Symbol) =
430-
!x.isValueClassConvertMethod &&
431-
!x.name.is(DocArtifactName)
430+
!x.isValueClassConvertMethod &&
431+
!x.name.is(DocArtifactName)
432432

433433
val decls = cls.classInfo.decls.toList.toSet.filter(isNonMagicalMember)
434434
val defined = impl.body.map(_.symbol)
435435

436436
val symbolsNotDefined = decls -- defined - constr.symbol
437437

438438
assert(symbolsNotDefined.isEmpty,
439-
i" $cls tree does not define methods: ${symbolsNotDefined.toList}%, %\n" +
440-
i"expected: $decls%, %\n" +
441-
i"defined: $defined%, %")
439+
i" $cls tree does not define members: ${symbolsNotDefined.toList}%, %\n" +
440+
i"expected: ${decls.toList}%, %\n" +
441+
i"defined: ${defined}%, %")
442442

443443
super.typedClassDef(cdef, cls)
444444
}

0 commit comments

Comments
 (0)