Skip to content

Commit 11e2526

Browse files
authored
Merge pull request #2423 from abeln/local-var
Fix #2368: local variables must be initialized
2 parents ff88246 + 164408d commit 11e2526

File tree

4 files changed

+25
-5
lines changed

4 files changed

+25
-5
lines changed

compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,10 @@ object messages {
490490
|${"var a = _"}
491491
|
492492
|Note that this use of `_` is not placeholder syntax,
493-
|but an uninitialized var definition"""
493+
|but an uninitialized var definition.
494+
|Only fields can be left uninitialized in this manner; local variables
495+
|must be initialized.
496+
|"""
494497
}
495498

496499
case class IllegalStartSimpleExpr(illegalToken: String)(implicit ctx: Context)

compiler/src/dotty/tools/dotc/typer/RefChecks.scala

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,7 @@ class RefChecks extends MiniPhase { thisTransformer =>
774774

775775
import tpd._
776776
import reporting.diagnostic.messages.ForwardReferenceExtendsOverDefinition
777+
import dotty.tools.dotc.reporting.diagnostic.messages.UnboundPlaceholderParameter
777778

778779
override def phaseName: String = "refchecks"
779780

@@ -796,12 +797,19 @@ class RefChecks extends MiniPhase { thisTransformer =>
796797
override def transformValDef(tree: ValDef)(implicit ctx: Context, info: TransformerInfo) = {
797798
checkDeprecatedOvers(tree)
798799
val sym = tree.symbol
799-
if (sym.exists && sym.owner.isTerm && !sym.is(Lazy))
800-
currentLevel.levelAndIndex.get(sym) match {
801-
case Some((level, symIdx)) if symIdx <= level.maxIndex =>
802-
ctx.error(ForwardReferenceExtendsOverDefinition(sym, level.refSym), level.refPos)
800+
if (sym.exists && sym.owner.isTerm) {
801+
tree.rhs match {
802+
case Ident(nme.WILDCARD) => ctx.error(UnboundPlaceholderParameter(), sym.pos)
803803
case _ =>
804804
}
805+
if (!sym.is(Lazy)) {
806+
currentLevel.levelAndIndex.get(sym) match {
807+
case Some((level, symIdx)) if symIdx <= level.maxIndex =>
808+
ctx.error(ForwardReferenceExtendsOverDefinition(sym, level.refSym), level.refPos)
809+
case _ =>
810+
}
811+
}
812+
}
805813
tree
806814
}
807815

tests/neg/t2368.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class C {
2+
def foo() = {
3+
var x: String = _ // error: local variables can't be left uninitialized
4+
}
5+
}

tests/pos/t2368.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class C {
2+
// A `var` field can be left uninitialized.
3+
var x: String = _
4+
}

0 commit comments

Comments
 (0)