@@ -1099,8 +1099,8 @@ object desugar {
10991099 paramss match
11001100 case rightParam :: paramss1 => // `rightParam` must have a single parameter and without `given` flag
11011101
1102- def badRightAssoc (problem : String ) =
1103- report.error(em " right-associative extension method $problem" , mdef.srcPos )
1102+ def badRightAssoc (problem : String , pos : SrcPos ) =
1103+ report.error(em " right-associative extension method $problem" , pos )
11041104 extParamss ++ mdef.paramss
11051105
11061106 rightParam match
@@ -1116,11 +1116,23 @@ object desugar {
11161116 //
11171117 // If you change the names of the clauses below, also change them in right-associative-extension-methods.md
11181118 val (leftTyParamsAndLeadingUsing, leftParamAndTrailingUsing) = extParamss.span(isUsingOrTypeParamClause)
1119+
1120+ val names = (for ps <- mdef.paramss; p <- ps yield p.name).toSet[Name ]
1121+
1122+ val tt = new untpd.UntypedTreeTraverser :
1123+ def traverse (tree : Tree )(using Context ): Unit = tree match
1124+ case tree : Ident if names.contains(tree.name) =>
1125+ badRightAssoc(s " cannot have a forward reference to ${tree.name}" , tree.srcPos)
1126+ case _ => traverseChildren(tree)
1127+
1128+ for ts <- leftParamAndTrailingUsing; t <- ts do
1129+ tt.traverse(t)
1130+
11191131 leftTyParamsAndLeadingUsing ::: rightTyParams ::: rightParam :: leftParamAndTrailingUsing ::: paramss1
11201132 else
1121- badRightAssoc(" cannot start with using clause" )
1133+ badRightAssoc(" cannot start with using clause" , mdef.srcPos )
11221134 case _ =>
1123- badRightAssoc(" must start with a single parameter" )
1135+ badRightAssoc(" must start with a single parameter" , mdef.srcPos )
11241136 case _ =>
11251137 // no value parameters, so not an infix operator.
11261138 extParamss ++ mdef.paramss
0 commit comments