aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/typer/RefChecks.scala
diff options
context:
space:
mode:
authorliu fengyun <liufengyunchina@gmail.com>2016-11-07 23:57:06 +0100
committerliu fengyun <liu@fengy.me>2016-11-24 13:36:05 +0100
commitabb9aa802789e6b43ff07c45281eedbb09512585 (patch)
treef0c74d053602dd64f0489780726ee9ef9a5fe4c2 /compiler/src/dotty/tools/dotc/typer/RefChecks.scala
parent8592af1c815c34078d89c08536addbe757550179 (diff)
downloaddotty-abb9aa802789e6b43ff07c45281eedbb09512585.tar.gz
dotty-abb9aa802789e6b43ff07c45281eedbb09512585.tar.bz2
dotty-abb9aa802789e6b43ff07c45281eedbb09512585.zip
fix #1642: disallow value classe wrapping value class
Diffstat (limited to 'compiler/src/dotty/tools/dotc/typer/RefChecks.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/typer/RefChecks.scala7
1 files changed, 5 insertions, 2 deletions
diff --git a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala
index feeb80547..f9c9ddee4 100644
--- a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala
+++ b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala
@@ -18,7 +18,7 @@ import config.{ScalaVersion, NoScalaVersion}
import Decorators._
import typer.ErrorReporting._
import DenotTransformers._
-import ValueClasses.isDerivedValueClass
+import ValueClasses.{isDerivedValueClass, isCyclic}
object RefChecks {
import tpd._
@@ -707,12 +707,15 @@ object RefChecks {
ctx.error("`abstract' modifier cannot be used with value classes", clazz.pos)
if (!clazz.isStatic)
ctx.error(s"value class may not be a ${if (clazz.owner.isTerm) "local class" else "member of another class"}", clazz.pos)
+ if (isCyclic(clazz.asClass))
+ ctx.error("value class cannot wrap itself", clazz.pos)
else {
- val clParamAccessors = clazz.asClass.paramAccessors.filter(sym => sym.isTerm && !sym.is(Method))
+ val clParamAccessors = clazz.asClass.paramAccessors.filter(_.isTerm)
clParamAccessors match {
case List(param) =>
if (param.is(Mutable))
ctx.error("value class parameter must not be a var", param.pos)
+
case _ =>
ctx.error("value class needs to have exactly one val parameter", clazz.pos)
}