Skip to content

Commit a05ffad

Browse files
committed
Fix #7748: Don't allow classes to be defined in universal traits
1 parent 9aa7991 commit a05ffad

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1810,6 +1810,10 @@ class Typer extends Namer
18101810
// check value class constraints
18111811
checkDerivedValueClass(cls, body1)
18121812

1813+
val effectiveOwner = cls.owner.skipWeakOwner
1814+
if !cls.isRefinementClass && effectiveOwner.is(Trait) && !effectiveOwner.derivesFrom(defn.ObjectClass)
1815+
ctx.error(i"class $cls cannot be defined in universal $effectiveOwner", cdef.sourcePos)
1816+
18131817
// Temporarily set the typed class def as root tree so that we have at least some
18141818
// information in the IDE in case we never reach `SetRootTree`.
18151819
if (ctx.mode.is(Mode.Interactive) && ctx.settings.YretainTrees.value)

tests/neg/i7748.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
trait A extends Any {
2+
case class B() // error
3+
val x = {
4+
case class C() // error
5+
1
6+
}
7+
def f = {
8+
case class C() // ok
9+
1
10+
}
11+
}

0 commit comments

Comments
 (0)