@@ -441,7 +441,6 @@ object Checking {
441
441
case List (param) =>
442
442
if (param.is(Mutable ))
443
443
ctx.error(" value class parameter must not be a var" , param.pos)
444
-
445
444
case _ =>
446
445
ctx.error(" value class needs to have exactly one val parameter" , clazz.pos)
447
446
}
@@ -625,6 +624,24 @@ trait Checking {
625
624
case _ =>
626
625
}
627
626
}
627
+
628
+ /** Check that method parameter types do not reference their own parameter
629
+ * or later parameters in the same parameter section.
630
+ */
631
+ def checkNoForwardDependencies (vparams : List [ValDef ])(implicit ctx : Context ): Unit = vparams match {
632
+ case vparam :: vparams1 =>
633
+ val check = new TreeTraverser {
634
+ def traverse (tree : Tree )(implicit ctx : Context ) = tree match {
635
+ case id : Ident if vparams.exists(_.symbol == id.symbol) =>
636
+ ctx.error(" illegal forward reference to method parameter" , id.pos)
637
+ case _ =>
638
+ traverseChildren(tree)
639
+ }
640
+ }
641
+ check.traverse(vparam.tpt)
642
+ checkNoForwardDependencies(vparams1)
643
+ case Nil =>
644
+ }
628
645
}
629
646
630
647
trait NoChecking extends Checking {
@@ -642,4 +659,5 @@ trait NoChecking extends Checking {
642
659
override def checkNotSingleton (tpt : Tree , where : String )(implicit ctx : Context ): Tree = tpt
643
660
override def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(implicit ctx : Context ) = ()
644
661
override def checkTraitInheritance (parentSym : Symbol , cls : ClassSymbol , pos : Position )(implicit ctx : Context ) = ()
662
+ override def checkNoForwardDependencies (vparams : List [ValDef ])(implicit ctx : Context ): Unit = ()
645
663
}
0 commit comments