aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/typer/Checking.scala8
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala5
-rw-r--r--tests/neg/singletonOrs.scala6
3 files changed, 17 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/typer/Checking.scala b/src/dotty/tools/dotc/typer/Checking.scala
index 7ba66e3d8..3461facc1 100644
--- a/src/dotty/tools/dotc/typer/Checking.scala
+++ b/src/dotty/tools/dotc/typer/Checking.scala
@@ -542,6 +542,13 @@ trait Checking {
errorTree(tpt, ex"missing type parameter for ${tpt.tpe}")
}
else tpt
+
+ /** Check that `tpt` does not refer to a singleton type */
+ def checkNotSingleton(tpt: Tree, where: String)(implicit ctx: Context): Tree =
+ if (tpt.tpe.isInstanceOf[SingletonType]) {
+ errorTree(tpt, ex"Singleton type ${tpt.tpe} is not allowed $where")
+ }
+ else tpt
}
trait NoChecking extends Checking {
@@ -556,4 +563,5 @@ trait NoChecking extends Checking {
override def checkNoDoubleDefs(cls: Symbol)(implicit ctx: Context): Unit = ()
override def checkParentCall(call: Tree, caller: ClassSymbol)(implicit ctx: Context) = ()
override def checkSimpleKinded(tpt: Tree)(implicit ctx: Context): Tree = tpt
+ override def checkNotSingleton(tpt: Tree, where: String)(implicit ctx: Context): Tree = tpt
}
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index bbb20bcf5..e423082d5 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -999,8 +999,9 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
}
def typedOrTypeTree(tree: untpd.OrTypeTree)(implicit ctx: Context): OrTypeTree = track("typedOrTypeTree") {
- val left1 = typed(tree.left)
- val right1 = typed(tree.right)
+ val where = "in a union type"
+ val left1 = checkNotSingleton(typed(tree.left), where)
+ val right1 = checkNotSingleton(typed(tree.right), where)
assignType(cpy.OrTypeTree(tree)(left1, right1), left1, right1)
}
diff --git a/tests/neg/singletonOrs.scala b/tests/neg/singletonOrs.scala
new file mode 100644
index 000000000..687e491ef
--- /dev/null
+++ b/tests/neg/singletonOrs.scala
@@ -0,0 +1,6 @@
+object Test {
+ def foo: 1 | 2 = 1 // error // error
+ def bar: 3 | 4 = foo // error // error
+ def foo: 1 | 2 = 1 // error // error
+ def bar: 1 = foo
+}