@@ -934,8 +934,8 @@ object desugar {
934934 paramss match
935935 case rightParam :: paramss1 => // `rightParam` must have a single parameter and without `given` flag
936936
937- def badRightAssoc (problem : String ) =
938- report.error(em " right-associative extension method $problem" , mdef.srcPos )
937+ def badRightAssoc (problem : String , pos : SrcPos ) =
938+ report.error(em " right-associative extension method $problem" , pos )
939939 extParamss ++ mdef.paramss
940940
941941 rightParam match
@@ -951,11 +951,23 @@ object desugar {
951951 //
952952 // If you change the names of the clauses below, also change them in right-associative-extension-methods.md
953953 val (leftTyParamsAndLeadingUsing, leftParamAndTrailingUsing) = extParamss.span(isUsingOrTypeParamClause)
954+
955+ val names = (for ps <- mdef.paramss; p <- ps yield p.name).toSet[Name ]
956+
957+ val tt = new untpd.UntypedTreeTraverser :
958+ def traverse (tree : Tree )(using Context ): Unit = tree match
959+ case tree : Ident if names.contains(tree.name) =>
960+ badRightAssoc(s " cannot have a forward reference to ${tree.name}" , tree.srcPos)
961+ case _ => traverseChildren(tree)
962+
963+ for ts <- leftParamAndTrailingUsing; t <- ts do
964+ tt.traverse(t)
965+
954966 leftTyParamsAndLeadingUsing ::: rightTyParams ::: rightParam :: leftParamAndTrailingUsing ::: paramss1
955967 else
956- badRightAssoc(" cannot start with using clause" )
968+ badRightAssoc(" cannot start with using clause" , mdef.srcPos )
957969 case _ =>
958- badRightAssoc(" must start with a single parameter" )
970+ badRightAssoc(" must start with a single parameter" , mdef.srcPos )
959971 case _ =>
960972 // no value parameters, so not an infix operator.
961973 extParamss ++ mdef.paramss
0 commit comments