diff --git a/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala b/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala index e6e48f75ede5..925d3f74c415 100644 --- a/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala +++ b/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala @@ -64,7 +64,8 @@ object DesugarEnums { } /** A type tree referring to `enumClass` */ - def enumClassRef(implicit ctx: Context) = TypeTree(enumClass.typeRef) + def enumClassRef(implicit ctx: Context) = + if (enumClass.exists) TypeTree(enumClass.typeRef) else TypeTree() /** Add implied flags to an enum class or an enum case */ def addEnumFlags(cdef: TypeDef)(implicit ctx: Context) = @@ -89,7 +90,7 @@ object DesugarEnums { DefDef(name.toTermName, Nil, Nil, TypeTree(), valuesDot(select)) val privateValuesDef = ValDef(nme.DOLLAR_VALUES, TypeTree(), - New(TypeTree(defn.EnumValuesType.appliedTo(enumClass.typeRef :: Nil)), ListOfNil)) + New(TypeTree(defn.EnumValuesType.appliedTo(enumClass.typeRef :: Nil)), ListOfNil)) .withFlags(Private) val valueOfDef = enumDefDef("enumValue", "fromInt") val withNameDef = enumDefDef("enumValueNamed", "fromName") @@ -195,7 +196,8 @@ object DesugarEnums { /** Expand a module definition representing a parameterless enum case */ def expandEnumModule(name: TermName, impl: Template, mods: Modifiers, pos: Position)(implicit ctx: Context): Tree = { assert(impl.body.isEmpty) - if (impl.parents.isEmpty) + if (!enumClass.exists) EmptyTree + else if (impl.parents.isEmpty) expandSimpleEnumCase(name, mods, pos) else { def toStringMeth = @@ -210,7 +212,8 @@ object DesugarEnums { /** Expand a simple enum case */ def expandSimpleEnumCase(name: TermName, mods: Modifiers, pos: Position)(implicit ctx: Context): Tree = - if (enumClass.typeParams.nonEmpty) { + if (!enumClass.exists) EmptyTree + else if (enumClass.typeParams.nonEmpty) { val parent = interpolatedEnumParent(pos) val impl = Template(emptyConstructor, parent :: Nil, EmptyValDef, Nil) expandEnumModule(name, impl, mods, pos) diff --git a/tests/neg/i4470a.scala b/tests/neg/i4470a.scala new file mode 100644 index 000000000000..b0c4b2c3d405 --- /dev/null +++ b/tests/neg/i4470a.scala @@ -0,0 +1,10 @@ +object RepeatedEnum { + + enum Maybe { // error // error + case Foo + } + + enum Maybe { // error + case Foo + } +} diff --git a/tests/neg/i4470b.scala b/tests/neg/i4470b.scala new file mode 100644 index 000000000000..716f3edc1089 --- /dev/null +++ b/tests/neg/i4470b.scala @@ -0,0 +1,10 @@ +object RepeatedExtendEnum { + + enum Maybe[T] { // error // error + case Foo extends Maybe[Int] + } + + enum Maybe[T] { // error + case Foo extends Maybe[Int] + } +} diff --git a/tests/neg/i4470c.scala b/tests/neg/i4470c.scala new file mode 100644 index 000000000000..b5f222905bce --- /dev/null +++ b/tests/neg/i4470c.scala @@ -0,0 +1,9 @@ +object DuplicatedEnum { + enum Maybe[+T] { // error // error + case Some(x: T) + } + + enum Maybe[+T] { // error + case Some(x: T) + } +}