File tree Expand file tree Collapse file tree 3 files changed +39
-1
lines changed
compiler/src/dotty/tools/dotc/typer Expand file tree Collapse file tree 3 files changed +39
-1
lines changed Original file line number Diff line number Diff line change @@ -178,7 +178,20 @@ class VarianceChecker(using Context) {
178178 i " \n ${hl(" enum case" )} ${towner.name} requires explicit declaration of $tvar to resolve this issue. \n $example"
179179 else
180180 " "
181- em " ${varianceLabel(tvar.flags)} $tvar occurs in ${varianceLabel(required)} position in type ${sym.info} of $sym$enumAddendum"
181+ val privateParamAddendum =
182+ if sym.flags.is(ParamAccessor ) && sym.flags.is(Private ) then
183+ val varOrVal = if sym.is(Mutable ) then " var" else " val"
184+ val varFieldInstead = if sym.is(Mutable ) then " and add\n a field inside the class instead" else " "
185+ s """
186+ |
187+ |Implementation limitation: ${hl(f " private $varOrVal" )} parameters cannot be inferred to be local
188+ |and therefore are always variance-checked.
189+ |
190+ |Potential fix: remove the ${hl(f " private $varOrVal" )} modifiers on the parameter ${sym.name}$varFieldInstead.
191+ """ .stripMargin
192+ else
193+ " "
194+ em " ${varianceLabel(tvar.flags)} $tvar occurs in ${varianceLabel(required)} position in type ${sym.info} of $sym$enumAddendum$privateParamAddendum"
182195 if (migrateTo3 &&
183196 (sym.owner.isConstructor || sym.ownersIterator.exists(_.isAllOf(ProtectedLocal ))))
184197 report.migrationWarning(
Original file line number Diff line number Diff line change 1+ -- Error: tests/neg/i22620.scala:4:34 ----------------------------------------------------------------------------------
2+ 4 |class PrivateTest[-M](private val v: ArrayBuffer[M]) // error
3+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4+ | contravariant type M occurs in invariant position in type scala.collection.mutable.ArrayBuffer[M] of value v
5+ |
6+ | Implementation limitation: private val parameters cannot be inferred to be local
7+ | and therefore are always variance-checked.
8+ |
9+ | Potential fix: remove the private val modifiers on the parameter v.
10+ |
11+ -- Error: tests/neg/i22620.scala:6:37 ----------------------------------------------------------------------------------
12+ 6 |class PrivateTestMut[-M](private var v: ArrayBuffer[M]) // error
13+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14+ | contravariant type M occurs in invariant position in type scala.collection.mutable.ArrayBuffer[M] of variable v
15+ |
16+ | Implementation limitation: private var parameters cannot be inferred to be local
17+ | and therefore are always variance-checked.
18+ |
19+ | Potential fix: remove the private var modifiers on the parameter v and add
20+ | a field inside the class instead.
21+ |
Original file line number Diff line number Diff line change 22import scala .collection .mutable .ArrayBuffer
33
44class PrivateTest [- M ](private val v : ArrayBuffer [M ]) // error
5+
6+ class PrivateTestMut [- M ](private var v : ArrayBuffer [M ]) // error
7+
8+ class PrivateTestParamOnly [- M ](v : ArrayBuffer [M ]) // no error
You can’t perform that action at this time.
0 commit comments