Skip to content

Commit 8cddc66

Browse files
authored
Merge pull request #11098 from dotty-staging/fix-#11081
Tighten condition when to check enum constructors
2 parents 4c27adf + 79ee0a2 commit 8cddc66

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,7 +1180,7 @@ trait Checking {
11801180
*/
11811181
def checkEnumCaseRefsLegal(cdef: TypeDef, enumCtx: Context)(using Context): Unit = {
11821182

1183-
def checkCaseOrDefault(stat: Tree, caseCtx: Context) = {
1183+
def checkEnumCaseOrDefault(stat: Tree, caseCtx: Context) = {
11841184

11851185
def check(tree: Tree) = {
11861186
// allow access to `sym` if a typedIdent just outside the enclosing enum
@@ -1193,7 +1193,7 @@ trait Checking {
11931193
checkRefsLegal(tree, cdef.symbol, allowAccess, "enum case")
11941194
}
11951195

1196-
if (stat.symbol.is(Case))
1196+
if (stat.symbol.isAllOf(EnumCase))
11971197
stat match {
11981198
case TypeDef(_, Template(DefDef(_, paramss, _, _), parents, _, _)) =>
11991199
paramss.foreach(_.foreach(check))
@@ -1207,7 +1207,7 @@ trait Checking {
12071207
}
12081208
case _ =>
12091209
}
1210-
else if (stat.symbol.is(Module) && stat.symbol.linkedClass.is(Case))
1210+
else if (stat.symbol.is(Module) && stat.symbol.linkedClass.isAllOf(EnumCase))
12111211
stat match {
12121212
case TypeDef(_, impl: Template) =>
12131213
for ((defaultGetter @
@@ -1219,16 +1219,16 @@ trait Checking {
12191219

12201220
cdef.rhs match {
12211221
case impl: Template =>
1222-
def isCase(stat: Tree) = stat match {
1223-
case _: ValDef | _: TypeDef => stat.symbol.is(Case)
1222+
def isEnumCase(stat: Tree) = stat match {
1223+
case _: ValDef | _: TypeDef => stat.symbol.isAllOf(EnumCase)
12241224
case _ => false
12251225
}
12261226
val cases =
1227-
for (stat <- impl.body if isCase(stat))
1227+
for (stat <- impl.body if isEnumCase(stat))
12281228
yield untpd.ImportSelector(untpd.Ident(stat.symbol.name.toTermName))
12291229
val caseImport: Import = Import(ref(cdef.symbol), cases)
12301230
val caseCtx = enumCtx.importContext(caseImport, caseImport.symbol)
1231-
for (stat <- impl.body) checkCaseOrDefault(stat, caseCtx)
1231+
for (stat <- impl.body) checkEnumCaseOrDefault(stat, caseCtx)
12321232
case _ =>
12331233
}
12341234
}

tests/neg/i11081.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
enum Outer:
2+
case Foo(u: Unavailable) // error
3+
case Bar(u: DefinitelyNotAvailable) // error
4+
object Outer:
5+
class Unavailable(i: Int)
6+
case class DefinitelyNotAvailable()

tests/pos/i11081.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
enum Outer:
2+
case Foo
3+
object Outer:
4+
trait Bar
5+
case class Baz(bar: Bar)
6+
case class Bam(bar: Bar = new Bar() {})

0 commit comments

Comments
 (0)