diff --git a/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala b/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala index 59dd65fef043..c06c56cacaee 100644 --- a/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala +++ b/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala @@ -70,8 +70,8 @@ object DesugarEnums { /** Add implied flags to an enum class or an enum case */ def addEnumFlags(cdef: TypeDef)(implicit ctx: Context): TypeDef = - if (cdef.mods.isEnumClass) cdef.withMods(cdef.mods.withFlags(cdef.mods.flags | Abstract | Sealed)) - else if (isEnumCase(cdef)) cdef.withMods(cdef.mods.withFlags(cdef.mods.flags | Final)) + if (cdef.mods.isEnumClass) cdef.withMods(cdef.mods.withFlags(cdef.mods.flags.toTypeFlags | Abstract | Sealed)) + else if (isEnumCase(cdef)) cdef.withMods(cdef.mods | Final) else cdef private def valuesDot(name: PreName)(implicit src: SourceFile) = diff --git a/compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala b/compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala index 43c2410d5bad..c93fec3a2bfd 100644 --- a/compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala +++ b/compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala @@ -2259,6 +2259,13 @@ object messages { override def explanation: String = "" } + case class LazyEnum()(implicit val ctx: Context) + extends Message(LazyStaticFieldID) { + override def msg: String = "modifier lazy is not allowed for enums" + override def kind: String = "Syntax" + override def explanation: String = "" + } + case class StaticOverridingNonStaticMembers()(implicit val ctx: Context) extends Message(StaticOverridingNonStaticMembersID) { override def msg: String = em"${hl("@static")} members cannot override or implement non-static ones" diff --git a/compiler/src/dotty/tools/dotc/typer/Checking.scala b/compiler/src/dotty/tools/dotc/typer/Checking.scala index 736a3498faa7..758496cc4bca 100644 --- a/compiler/src/dotty/tools/dotc/typer/Checking.scala +++ b/compiler/src/dotty/tools/dotc/typer/Checking.scala @@ -440,7 +440,9 @@ object Checking { checkCombination(Lazy, Inline) checkNoConflict(Lazy, ParamAccessor, s"parameter may not be `lazy`") if (sym.is(Inline)) checkApplicable(Inline, sym.isTerm && !sym.is(Mutable | Module)) - if (sym.is(Lazy)) checkApplicable(Lazy, !sym.is(Method | Mutable)) + if(sym.is(Enum) && sym.flags.toTermFlags.is(Lazy)) { + fail(LazyEnum()) + } if (sym.isType && !sym.is(Deferred)) for (cls <- sym.allOverriddenSymbols.filter(_.isClass)) { fail(CannotHaveSameNameAs(sym, cls, CannotHaveSameNameAs.CannotBeOverridden)) diff --git a/tests/neg/i5034.scala b/tests/neg/i5034.scala new file mode 100755 index 000000000000..a2cf8337e16d --- /dev/null +++ b/tests/neg/i5034.scala @@ -0,0 +1,3 @@ +lazy enum Color { // error + case Blue +} diff --git a/tests/pending/fuzzy/AE-2251401fe4c14de0510247ea75752a42fcfb237a.scala b/tests/pending/fuzzy/AE-2251401fe4c14de0510247ea75752a42fcfb237a.scala deleted file mode 100755 index 072db51948be..000000000000 --- a/tests/pending/fuzzy/AE-2251401fe4c14de0510247ea75752a42fcfb237a.scala +++ /dev/null @@ -1 +0,0 @@ -lazy enum i0