Skip to content

Commit 75bea8d

Browse files
authored
Merge pull request #1936 from dotty-staging/fix-1916-on-implicit-functions
Fix #1916: fix erasure of implicit xxl closures
2 parents 18d5913 + 50e40ff commit 75bea8d

File tree

5 files changed

+45
-6
lines changed

5 files changed

+45
-6
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,8 +733,8 @@ class Definitions {
733733

734734
def isFunctionClass(cls: Symbol) = isVarArityClass(cls, tpnme.Function)
735735
def isImplicitFunctionClass(cls: Symbol) = isVarArityClass(cls, tpnme.ImplicitFunction)
736-
def isUnimplementedFunctionClass(cls: Symbol) =
737-
isFunctionClass(cls) && cls.name.functionArity > MaxImplementedFunctionArity
736+
/** Is a class that will be erased to FunctionXXL */
737+
def isXXLFunctionClass(cls: Symbol) = cls.name.functionArity > MaxImplementedFunctionArity
738738
def isAbstractFunctionClass(cls: Symbol) = isVarArityClass(cls, tpnme.AbstractFunction)
739739
def isTupleClass(cls: Symbol) = isVarArityClass(cls, tpnme.Tuple)
740740
def isProductClass(cls: Symbol) = isVarArityClass(cls, tpnme.Product)

compiler/src/dotty/tools/dotc/core/TypeErasure.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ object TypeErasure {
4444
val sym = tp.symbol
4545
sym.isClass &&
4646
sym != defn.AnyClass && sym != defn.ArrayClass &&
47-
!defn.isUnimplementedFunctionClass(sym) && !defn.isImplicitFunctionClass(sym)
47+
!defn.isXXLFunctionClass(sym) && !defn.isImplicitFunctionClass(sym)
4848
case _: TermRef =>
4949
true
5050
case JavaArrayType(elem) =>
@@ -358,7 +358,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
358358
if (!sym.isClass) this(tp.info)
359359
else if (semiEraseVCs && isDerivedValueClass(sym)) eraseDerivedValueClassRef(tp)
360360
else if (sym == defn.ArrayClass) apply(tp.appliedTo(TypeBounds.empty)) // i966 shows that we can hit a raw Array type.
361-
else if (defn.isUnimplementedFunctionClass(sym)) defn.FunctionXXLType
361+
else if (defn.isXXLFunctionClass(sym)) defn.FunctionXXLType
362362
else if (defn.isImplicitFunctionClass(sym)) apply(defn.FunctionType(sym.name.functionArity))
363363
else eraseNormalClassRef(tp)
364364
case tp: RefinedType =>

compiler/src/dotty/tools/dotc/transform/Erasure.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ object Erasure extends TypeTestsCasts{
349349
if ((owner eq defn.AnyClass) || (owner eq defn.AnyValClass)) {
350350
assert(sym.isConstructor, s"${sym.showLocated}")
351351
defn.ObjectClass
352-
} else if (defn.isUnimplementedFunctionClass(owner))
352+
} else if (defn.isXXLFunctionClass(owner))
353353
defn.FunctionXXLClass
354354
else if (defn.isImplicitFunctionClass(owner))
355355
recur(defn.FunctionClass(owner.name.functionArity))
@@ -542,7 +542,7 @@ object Erasure extends TypeTestsCasts{
542542
* to deal with boxing and unboxing of value classes ourselves.
543543
*/
544544
override def typedClosure(tree: untpd.Closure, pt: Type)(implicit ctx: Context) = {
545-
val xxl = defn.isUnimplementedFunctionClass(tree.typeOpt.typeSymbol)
545+
val xxl = defn.isXXLFunctionClass(tree.typeOpt.typeSymbol)
546546
var implClosure @ Closure(_, meth, _) = super.typedClosure(tree, pt)
547547
if (xxl) implClosure = cpy.Closure(implClosure)(tpt = TypeTree(defn.FunctionXXLType))
548548
implClosure.tpe match {

tests/run/implicitFunctionXXL.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Hello 42

tests/run/implicitFunctionXXL.scala

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
object Test {
2+
3+
def main(args: Array[String]): Unit = {
4+
5+
implicit val intWorld: Int = 42
6+
implicit val strWorld: String = "Hello "
7+
8+
val i1 = (implicit (x1: Int,
9+
x2: String,
10+
x3: Int,
11+
x4: Int,
12+
x5: Int,
13+
x6: Int,
14+
x7: Int,
15+
x8: Int,
16+
x9: Int,
17+
x10: Int,
18+
x11: Int,
19+
x12: Int,
20+
x13: Int,
21+
x14: Int,
22+
x15: Int,
23+
x16: Int,
24+
x17: Int,
25+
x18: Int,
26+
x19: Int,
27+
x20: Int,
28+
x21: Int,
29+
x22: Int,
30+
x23: Int,
31+
x24: Int,
32+
x25: Int,
33+
x26: Int) => x2 + x1)
34+
35+
println(i1)
36+
}
37+
38+
}

0 commit comments

Comments
 (0)