Skip to content

Commit 0484364

Browse files
committed
Fix #6902: Avoid illegal characters for generated given names
Name encoding does not kick in automatically for operator symbols which appear in a prefix of a name, so the name `<<<_of_A_given` was kept as is, which is problematic since `<` is not valid in method names on the JVM (in `i6902.scala`, `<<<<` runs fine even before this change, because monomorphic givens are implemented as vals, not defs). Having to remember to call `avoidIllegalChars` isn't great, but fixing that should be part of a bigger refactoring of name mangling we still need to do: #5936.
1 parent 54b08e1 commit 0484364

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,7 @@ object desugar {
895895
*/
896896
def normalizeName(mdef: MemberDef, impl: Tree)(implicit ctx: Context): Name = {
897897
var name = mdef.name
898-
if (name.isEmpty) name = name.likeSpaced(s"${inventName(impl)}_given".toTermName)
898+
if (name.isEmpty) name = name.likeSpaced(avoidIllegalChars(s"${inventName(impl)}_given".toTermName.asSimpleName))
899899
if (ctx.owner == defn.ScalaPackageClass && defn.reservedScalaClassNames.contains(name.toTypeName)) {
900900
def kind = if (name.isTypeName) "class" else "object"
901901
ctx.error(em"illegal redefinition of standard $kind $name", mdef.sourcePos)

tests/run/i6902.scala

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
object Test {
2+
given [A] { def (a: A) <<< : A = a }
3+
given { def (b: Int) <<<< : Int = b }
4+
5+
def main(args: Array[String]): Unit = {
6+
1.<<<
7+
1.<<<<
8+
}
9+
}

0 commit comments

Comments
 (0)