Skip to content

Commit

Permalink
Merge pull request #9654 from joroKr21/forward-ref
Browse files Browse the repository at this point in the history
More details to forward reference error messages
  • Loading branch information
dwijnand committed Jun 4, 2021
2 parents 074cae1 + 9a1274f commit 36e218f
Show file tree
Hide file tree
Showing 10 changed files with 40 additions and 23 deletions.
13 changes: 8 additions & 5 deletions src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1215,23 +1215,26 @@ abstract class RefChecks extends Transform {
finally popLevel()
}

private def showCurrentRef: String = {
val refsym = currentLevel.refsym
s"$refsym defined on line ${refsym.pos.line}"
}

def transformStat(tree: Tree, index: Int): Tree = tree match {
case t if treeInfo.isSelfConstrCall(t) =>
assert(index == 0, index)
try transform(tree)
finally if (currentLevel.maxindex > 0) {
// An implementation restriction to avoid VerifyErrors and lazyvals mishaps; see scala/bug#4717
debuglog("refsym = " + currentLevel.refsym)
reporter.error(currentLevel.refpos, "forward reference not allowed from self constructor invocation")
// An implementation restriction to avoid VerifyErrors and lazy vals mishaps; see scala/bug#4717
reporter.error(currentLevel.refpos, s"forward reference to $showCurrentRef not allowed from self constructor invocation")
}
case ValDef(_, _, _, _) =>
val tree1 = transform(tree) // important to do before forward reference check
if (tree1.symbol.isLazy) tree1
else {
val sym = tree.symbol
if (sym.isLocalToBlock && index <= currentLevel.maxindex) {
debuglog("refsym = " + currentLevel.refsym)
reporter.error(currentLevel.refpos, "forward reference extends over definition of " + sym)
reporter.error(currentLevel.refpos, s"forward reference to $showCurrentRef extends over definition of $sym")
}
tree1
}
Expand Down
11 changes: 7 additions & 4 deletions test/files/neg/forward.check
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
forward.scala:6: error: forward reference extends over definition of value x
forward.scala:8: error: forward reference to value x defined on line 9 extends over definition of value x
def f: Int = x;
^
forward.scala:10: error: forward reference extends over definition of value x
forward.scala:12: error: forward reference to method g defined on line 14 extends over definition of value x
def f: Int = g;
^
forward.scala:15: error: forward reference extends over definition of variable x
forward.scala:17: error: forward reference to method g defined on line 19 extends over definition of variable x
def f: Int = g;
^
3 errors
forward.scala:29: error: forward reference to value ec defined on line 32 extends over definition of value z
a <- fInt
^
4 errors
11 changes: 11 additions & 0 deletions test/files/neg/forward.scala
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import scala.concurrent._

object Test {
def f: Int = x;
val x: Int = f;
Expand All @@ -21,4 +23,13 @@ object Test {
Console.println("foo");
def g: Int = f;
}
{
val fInt = Future.successful(1)
val z = for {
a <- fInt
} yield a

implicit val ec: ExecutionContext = ExecutionContext.Implicits.global
z
}
}
10 changes: 5 additions & 5 deletions test/files/neg/t2910.check
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
t2910.scala:3: error: forward reference extends over definition of value ret
t2910.scala:3: error: forward reference to value MyMatch defined on line 4 extends over definition of value ret
val ret = l.collect({ case MyMatch(id) => id })
^
t2910.scala:9: error: forward reference extends over definition of value z
t2910.scala:9: error: forward reference to lazy value s defined on line 11 extends over definition of value z
println(s.length)
^
t2910.scala:16: error: forward reference extends over definition of value z
t2910.scala:16: error: forward reference to lazy value x defined on line 18 extends over definition of value z
x
^
t2910.scala:30: error: forward reference extends over definition of value x
t2910.scala:30: error: forward reference to value x defined on line 31 extends over definition of value x
lazy val f: Int = x
^
t2910.scala:35: error: forward reference extends over definition of variable x
t2910.scala:35: error: forward reference to lazy value g defined on line 37 extends over definition of variable x
lazy val f: Int = g
^
5 errors
8 changes: 4 additions & 4 deletions test/files/neg/t4098.check
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
t4098.scala:3: error: forward reference not allowed from self constructor invocation
t4098.scala:3: error: forward reference to method b defined on line 4 not allowed from self constructor invocation
this(b)
^
t4098.scala:8: error: forward reference not allowed from self constructor invocation
t4098.scala:8: error: forward reference to lazy value b defined on line 9 not allowed from self constructor invocation
this(b)
^
t4098.scala:13: error: forward reference not allowed from self constructor invocation
t4098.scala:13: error: forward reference to value b defined on line 14 not allowed from self constructor invocation
this(b)
^
t4098.scala:18: error: forward reference not allowed from self constructor invocation
t4098.scala:18: error: forward reference to method b defined on line 20 not allowed from self constructor invocation
this(b)
^
4 errors
2 changes: 1 addition & 1 deletion test/files/neg/t4419.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
t4419.scala:2: error: forward reference extends over definition of value b
t4419.scala:2: error: forward reference to value a defined on line 2 extends over definition of value b
{ val b = a; val a = 1 ; println(a) }
^
1 error
2 changes: 1 addition & 1 deletion test/files/neg/t5390.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
t5390.scala:7: error: forward reference extends over definition of value b
t5390.scala:7: error: forward reference to value a defined on line 8 extends over definition of value b
val b = a.B("")
^
1 error
2 changes: 1 addition & 1 deletion test/files/neg/t5390b.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
t5390b.scala:7: error: forward reference extends over definition of value b
t5390b.scala:7: error: forward reference to value a defined on line 8 extends over definition of value b
val b = a.B("")
^
1 error
2 changes: 1 addition & 1 deletion test/files/neg/t5390c.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
t5390c.scala:7: error: forward reference extends over definition of value b
t5390c.scala:7: error: forward reference to value a defined on line 8 extends over definition of value b
val b = new a.B("")
^
1 error
2 changes: 1 addition & 1 deletion test/files/neg/t5390d.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
t5390d.scala:7: error: forward reference extends over definition of value b
t5390d.scala:7: error: forward reference to value a defined on line 8 extends over definition of value b
val b = a.B.toString
^
1 error

0 comments on commit 36e218f

Please sign in to comment.