diff options
author | liu fengyun <liufengyunchina@gmail.com> | 2016-11-07 23:57:06 +0100 |
---|---|---|
committer | liu fengyun <liu@fengy.me> | 2016-11-24 13:36:05 +0100 |
commit | abb9aa802789e6b43ff07c45281eedbb09512585 (patch) | |
tree | f0c74d053602dd64f0489780726ee9ef9a5fe4c2 /compiler/src/dotty/tools/dotc/typer/RefChecks.scala | |
parent | 8592af1c815c34078d89c08536addbe757550179 (diff) | |
download | dotty-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.scala | 7 |
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) } |