diff --git a/compiler/src/dotty/tools/dotc/typer/Checking.scala b/compiler/src/dotty/tools/dotc/typer/Checking.scala index e2f160142e6d..a7a509f0f804 100644 --- a/compiler/src/dotty/tools/dotc/typer/Checking.scala +++ b/compiler/src/dotty/tools/dotc/typer/Checking.scala @@ -1180,7 +1180,7 @@ trait Checking { */ def checkEnumCaseRefsLegal(cdef: TypeDef, enumCtx: Context)(using Context): Unit = { - def checkCaseOrDefault(stat: Tree, caseCtx: Context) = { + def checkEnumCaseOrDefault(stat: Tree, caseCtx: Context) = { def check(tree: Tree) = { // allow access to `sym` if a typedIdent just outside the enclosing enum @@ -1193,7 +1193,7 @@ trait Checking { checkRefsLegal(tree, cdef.symbol, allowAccess, "enum case") } - if (stat.symbol.is(Case)) + if (stat.symbol.isAllOf(EnumCase)) stat match { case TypeDef(_, Template(DefDef(_, paramss, _, _), parents, _, _)) => paramss.foreach(_.foreach(check)) @@ -1207,7 +1207,7 @@ trait Checking { } case _ => } - else if (stat.symbol.is(Module) && stat.symbol.linkedClass.is(Case)) + else if (stat.symbol.is(Module) && stat.symbol.linkedClass.isAllOf(EnumCase)) stat match { case TypeDef(_, impl: Template) => for ((defaultGetter @ @@ -1219,16 +1219,16 @@ trait Checking { cdef.rhs match { case impl: Template => - def isCase(stat: Tree) = stat match { - case _: ValDef | _: TypeDef => stat.symbol.is(Case) + def isEnumCase(stat: Tree) = stat match { + case _: ValDef | _: TypeDef => stat.symbol.isAllOf(EnumCase) case _ => false } val cases = - for (stat <- impl.body if isCase(stat)) + for (stat <- impl.body if isEnumCase(stat)) yield untpd.ImportSelector(untpd.Ident(stat.symbol.name.toTermName)) val caseImport: Import = Import(ref(cdef.symbol), cases) val caseCtx = enumCtx.importContext(caseImport, caseImport.symbol) - for (stat <- impl.body) checkCaseOrDefault(stat, caseCtx) + for (stat <- impl.body) checkEnumCaseOrDefault(stat, caseCtx) case _ => } } diff --git a/tests/neg/i11081.scala b/tests/neg/i11081.scala new file mode 100644 index 000000000000..7c1e6ce6dec6 --- /dev/null +++ b/tests/neg/i11081.scala @@ -0,0 +1,6 @@ +enum Outer: + case Foo(u: Unavailable) // error + case Bar(u: DefinitelyNotAvailable) // error +object Outer: + class Unavailable(i: Int) + case class DefinitelyNotAvailable() diff --git a/tests/pos/i11081.scala b/tests/pos/i11081.scala new file mode 100644 index 000000000000..cd333d7e407d --- /dev/null +++ b/tests/pos/i11081.scala @@ -0,0 +1,6 @@ +enum Outer: + case Foo +object Outer: + trait Bar + case class Baz(bar: Bar) + case class Bam(bar: Bar = new Bar() {})