Skip to content

Commit 53298ce

Browse files
committed
Require implemented types to be traits
1 parent ff65a2b commit 53298ce

File tree

4 files changed

+9
-3
lines changed

4 files changed

+9
-3
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -853,10 +853,13 @@ object desugar {
853853
else
854854
constr1 = addEvidenceParams(constr1, evidenceParams)
855855

856+
val mods =
857+
if (isSimpleExtension) EmptyModifiers
858+
else EmptyModifiers.withAddedMod(Mod.TraitImplementation())
856859
val icls =
857860
TypeDef(extName,
858861
cpy.Template(impl)(constr = constr1, parents = parents1, body = body1))
859-
.withFlags(Implicit)
862+
.withMods(mods.withFlags(Implicit))
860863
desugr.println(i"desugar $extended --> $icls")
861864
classDef(icls)
862865
}

compiler/src/dotty/tools/dotc/ast/untpd.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
142142
case class Enum() extends Mod(Flags.EmptyFlags)
143143

144144
case class EnumCase() extends Mod(Flags.EmptyFlags)
145+
146+
case class TraitImplementation() extends Mod(Flags.EmptyFlags)
145147
}
146148

147149
/** Modifiers and annotations for definitions

compiler/src/dotty/tools/dotc/typer/Namer.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,8 @@ class Namer { typer: Typer =>
944944
if (cls.isRefinementClass) ptype
945945
else {
946946
val pt = checkClassType(ptype, parent.pos,
947-
traitReq = parent ne parents.head, stablePrefixReq = true)
947+
traitReq = (parent `ne` parents.head) || original.mods.hasMod[Mod.TraitImplementation],
948+
stablePrefixReq = true)
948949
if (pt.derivesFrom(cls)) {
949950
val addendum = parent match {
950951
case Select(qual: Super, _) if ctx.scala2Mode =>

tests/neg/extensions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ object extensions {
3030

3131
extend Circle2 extends HasArea {} // error: `implements` or `{` expected // error: `def` expected
3232

33-
extend Circle implements HasAreaClass {
33+
extend Circle implements HasAreaClass { // error: class HasAreaClass is not a trait
3434
def area = this.radius * this.radius * math.Pi
3535
}
3636

0 commit comments

Comments
 (0)