From d35e74eb6bc13f1f354029c9439cef35aecd972b Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Fri, 11 May 2012 00:11:45 +0200 Subject: Forbid forward refs from self constructor invocations. Prevents the wheels falling off during later compiler phases, or, worse, during bytecode verification. Closes SI-4098. --- src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/compiler/scala/tools/nsc/typechecker/RefChecks.scala') diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index 6bed0b1228..b04d768baa 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -1279,6 +1279,15 @@ abstract class RefChecks extends InfoTransform with reflect.internal.transform.R } def transformStat(tree: Tree, index: Int): List[Tree] = tree match { + case Apply(Select(This(_), nme.CONSTRUCTOR), args) => + assert(index == 0, index) + val t = transform(tree) + if (currentLevel.maxindex > 0) { + // An implementation restriction to avoid VerifyErrors and lazyvals mishaps; see SI-4717 + debuglog("refsym = " + currentLevel.refsym) + unit.error(currentLevel.refpos, "forward reference not allowed from self constructor invocation") + } + List(t) case ModuleDef(_, _, _) => eliminateModuleDefs(tree) case ValDef(_, _, _, _) => val tree1 @ ValDef(_, _, _, rhs) = transform(tree) // important to do before forward reference check -- cgit v1.2.3