aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2017-02-08 22:22:53 +1100
committerGitHub <noreply@github.com>2017-02-08 22:22:53 +1100
commit75bea8dccce2bc3c0e8298ee71061c9871fd26ac (patch)
tree6e6ebeeab651535c0810ce6eac08e7ff593b4234 /compiler
parent18d5913821064fffa0c74524ba1a8ead9a7def31 (diff)
parent50e40fffa866e5b41c5df93b3635165ab20e04b1 (diff)
downloaddotty-75bea8dccce2bc3c0e8298ee71061c9871fd26ac.tar.gz
dotty-75bea8dccce2bc3c0e8298ee71061c9871fd26ac.tar.bz2
dotty-75bea8dccce2bc3c0e8298ee71061c9871fd26ac.zip
Merge pull request #1936 from dotty-staging/fix-1916-on-implicit-functions
Fix #1916: fix erasure of implicit xxl closures
Diffstat (limited to 'compiler')
-rw-r--r--compiler/src/dotty/tools/dotc/core/Definitions.scala4
-rw-r--r--compiler/src/dotty/tools/dotc/core/TypeErasure.scala4
-rw-r--r--compiler/src/dotty/tools/dotc/transform/Erasure.scala4
3 files changed, 6 insertions, 6 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/Definitions.scala b/compiler/src/dotty/tools/dotc/core/Definitions.scala
index 7fe6505ff..866f6e7fa 100644
--- a/compiler/src/dotty/tools/dotc/core/Definitions.scala
+++ b/compiler/src/dotty/tools/dotc/core/Definitions.scala
@@ -733,8 +733,8 @@ class Definitions {
def isFunctionClass(cls: Symbol) = isVarArityClass(cls, tpnme.Function)
def isImplicitFunctionClass(cls: Symbol) = isVarArityClass(cls, tpnme.ImplicitFunction)
- def isUnimplementedFunctionClass(cls: Symbol) =
- isFunctionClass(cls) && cls.name.functionArity > MaxImplementedFunctionArity
+ /** Is a class that will be erased to FunctionXXL */
+ def isXXLFunctionClass(cls: Symbol) = cls.name.functionArity > MaxImplementedFunctionArity
def isAbstractFunctionClass(cls: Symbol) = isVarArityClass(cls, tpnme.AbstractFunction)
def isTupleClass(cls: Symbol) = isVarArityClass(cls, tpnme.Tuple)
def isProductClass(cls: Symbol) = isVarArityClass(cls, tpnme.Product)
diff --git a/compiler/src/dotty/tools/dotc/core/TypeErasure.scala b/compiler/src/dotty/tools/dotc/core/TypeErasure.scala
index 91e37d440..2a341390b 100644
--- a/compiler/src/dotty/tools/dotc/core/TypeErasure.scala
+++ b/compiler/src/dotty/tools/dotc/core/TypeErasure.scala
@@ -44,7 +44,7 @@ object TypeErasure {
val sym = tp.symbol
sym.isClass &&
sym != defn.AnyClass && sym != defn.ArrayClass &&
- !defn.isUnimplementedFunctionClass(sym) && !defn.isImplicitFunctionClass(sym)
+ !defn.isXXLFunctionClass(sym) && !defn.isImplicitFunctionClass(sym)
case _: TermRef =>
true
case JavaArrayType(elem) =>
@@ -358,7 +358,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
if (!sym.isClass) this(tp.info)
else if (semiEraseVCs && isDerivedValueClass(sym)) eraseDerivedValueClassRef(tp)
else if (sym == defn.ArrayClass) apply(tp.appliedTo(TypeBounds.empty)) // i966 shows that we can hit a raw Array type.
- else if (defn.isUnimplementedFunctionClass(sym)) defn.FunctionXXLType
+ else if (defn.isXXLFunctionClass(sym)) defn.FunctionXXLType
else if (defn.isImplicitFunctionClass(sym)) apply(defn.FunctionType(sym.name.functionArity))
else eraseNormalClassRef(tp)
case tp: RefinedType =>
diff --git a/compiler/src/dotty/tools/dotc/transform/Erasure.scala b/compiler/src/dotty/tools/dotc/transform/Erasure.scala
index 00abddd91..bba97c4c2 100644
--- a/compiler/src/dotty/tools/dotc/transform/Erasure.scala
+++ b/compiler/src/dotty/tools/dotc/transform/Erasure.scala
@@ -349,7 +349,7 @@ object Erasure extends TypeTestsCasts{
if ((owner eq defn.AnyClass) || (owner eq defn.AnyValClass)) {
assert(sym.isConstructor, s"${sym.showLocated}")
defn.ObjectClass
- } else if (defn.isUnimplementedFunctionClass(owner))
+ } else if (defn.isXXLFunctionClass(owner))
defn.FunctionXXLClass
else if (defn.isImplicitFunctionClass(owner))
recur(defn.FunctionClass(owner.name.functionArity))
@@ -542,7 +542,7 @@ object Erasure extends TypeTestsCasts{
* to deal with boxing and unboxing of value classes ourselves.
*/
override def typedClosure(tree: untpd.Closure, pt: Type)(implicit ctx: Context) = {
- val xxl = defn.isUnimplementedFunctionClass(tree.typeOpt.typeSymbol)
+ val xxl = defn.isXXLFunctionClass(tree.typeOpt.typeSymbol)
var implClosure @ Closure(_, meth, _) = super.typedClosure(tree, pt)
if (xxl) implClosure = cpy.Closure(implClosure)(tpt = TypeTree(defn.FunctionXXLType))
implClosure.tpe match {