aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala5
-rw-r--r--tests/neg/singletons.scala4
2 files changed, 8 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 33ec156a1..4441adcfb 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -782,7 +782,10 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
def typedSingletonTypeTree(tree: untpd.SingletonTypeTree)(implicit ctx: Context): SingletonTypeTree = track("typedSingletonTypeTree") {
val ref1 = typedExpr(tree.ref)
- checkStable(ref1.tpe, tree.pos)
+ val illegal = Set[Symbol](defn.NullClass, defn.SymbolClass)
+ val refSym = ref1.tpe.widen.typeSymbol
+ if (illegal contains refSym) ctx.error(i"$refSym is not a legal singleton constant type", tree.pos)
+ else checkStable(ref1.tpe, tree.pos)
assignType(cpy.SingletonTypeTree(tree)(ref1), ref1)
}
diff --git a/tests/neg/singletons.scala b/tests/neg/singletons.scala
index 3bf7ee050..e4c6db060 100644
--- a/tests/neg/singletons.scala
+++ b/tests/neg/singletons.scala
@@ -2,4 +2,8 @@ object Test {
val a: 42 = 43 // error: different constant
val x = 42
val z: 42 = x // error: x is not final
+
+ val n: null = null // error: Null is not a legal singleton type
+
+ val sym: 'sym = 'sym // error: Symbol is a legal singleton type
}