File tree 3 files changed +24
-1
lines changed
src/dotty/tools/dotc/typer
3 files changed +24
-1
lines changed Original file line number Diff line number Diff line change @@ -708,7 +708,19 @@ object RefChecks {
708
708
if (clazz.is(Abstract ))
709
709
ctx.error(" `abstract' modifier cannot be used with value classes" , clazz.pos)
710
710
if (! clazz.isStatic)
711
- ctx.error(" value class cannot be an inner class" , clazz.pos)
711
+ ctx.error(s " value class may not be a ${if (clazz.owner.isTerm) " local class" else " member of another class" }" , clazz.pos)
712
+ else {
713
+ val clParamAccessors = clazz.asClass.paramAccessors.filter(sym => sym.isTerm && ! sym.is(Method ))
714
+ clParamAccessors match {
715
+ case List (param) =>
716
+ if (param.is(Mutable ))
717
+ ctx.error(" value class parameter must not be a var" , param.pos)
718
+ if (param.is(PrivateLocal ))
719
+ ctx.error(" value class parameter must not be private[this]" , param.pos)
720
+ case _ =>
721
+ ctx.error(" value class needs to have exactly one val parameter" , clazz.pos)
722
+ }
723
+ }
712
724
stats.foreach(checkValueClassMember)
713
725
}
714
726
}
Original file line number Diff line number Diff line change @@ -185,6 +185,7 @@ class tests extends CompilerTest {
185
185
@ Test def neg_validateRefchecks = compileFile(negDir, " validate-refchecks" , xerrors = 2 )
186
186
@ Test def neg_skolemize = compileFile(negDir, " skolemize" , xerrors = 2 )
187
187
@ Test def neg_nested_bounds = compileFile(negDir, " nested_bounds" , xerrors = 1 )
188
+ @ Test def neg_valueClasses = compileFile(negDir, " valueClasses" , xerrors = 4 )
188
189
189
190
@ Test def run_all = runFiles(runDir)
190
191
Original file line number Diff line number Diff line change
1
+ class A1 {
2
+ class A2 (x : Int ) extends AnyVal // error: value class may not be a member of another class
3
+ }
4
+ class B1 {
5
+ def test = {
6
+ class B2 (x : Int ) extends AnyVal // error: value class may not be a local class
7
+ }
8
+ }
9
+ class C (private [this ] val u : Int ) extends AnyVal // error: value class parameter must not be private[this]
10
+ class D (u : Int ) extends AnyVal // error: value class parameter must not be private[this]
You can’t perform that action at this time.
0 commit comments