@@ -1064,11 +1064,23 @@ class Namer { typer: Typer =>
10641064 /** The forwarders defined by export `exp` */
10651065 private def exportForwarders (exp : Export )(using Context ): List [tpd.MemberDef ] =
10661066 val buf = new mutable.ListBuffer [tpd.MemberDef ]
1067- val Export (expr, selectors ) = exp
1067+ val Export (expr, selectors0 ) = exp
10681068 if expr.isEmpty then
10691069 report.error(em " Export selector must have prefix and `.` " , exp.srcPos)
10701070 return Nil
10711071
1072+ val renamed = mutable.Set [Name ]()
1073+ val selectors = selectors0 map {
1074+ case sel @ ImportSelector (imported, id @ Ident (alias), bound) if alias != nme.WILDCARD =>
1075+ if renamed.contains(alias) then
1076+ report.error(i " duplicate rename target " , id.srcPos)
1077+ cpy.ImportSelector (sel)(imported, EmptyTree , bound).asInstanceOf [ImportSelector ]
1078+ else
1079+ renamed += alias
1080+ sel
1081+ case sel => sel
1082+ }
1083+
10721084 val path = typedAheadExpr(expr, AnySelectionProto )
10731085 checkLegalExportPath(path, selectors)
10741086 lazy val wildcardBound = importBound(selectors, isGiven = false )
@@ -1083,6 +1095,8 @@ class Namer { typer: Typer =>
10831095 Skip
10841096 else if cls.derivesFrom(sym.owner) && (sym.owner == cls || ! sym.is(Deferred )) then
10851097 No (i " is already a member of $cls" )
1098+ else if renamed.contains(sym.name.toTermName) then
1099+ No (i " clashes with a renamed export " )
10861100 else if sym.is(Override ) then
10871101 sym.allOverriddenSymbols.find(
10881102 other => cls.derivesFrom(other.owner) && ! other.is(Deferred )
0 commit comments