Skip to content

Commit b577f64

Browse files
committed
Fix toFunctionType to handle erased function types
[Cherry-picked 81f5677][modified]
1 parent 934b988 commit b577f64

File tree

3 files changed

+9
-5
lines changed

3 files changed

+9
-5
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,6 +1466,7 @@ class Definitions {
14661466
def PolyFunctionType = PolyFunctionClass.typeRef
14671467

14681468
lazy val ErasedFunctionClass = requiredClass("scala.runtime.ErasedFunction")
1469+
def ErasedFunctionType = ErasedFunctionClass.typeRef
14691470

14701471
/** If `cls` is a class in the scala package, its name, otherwise EmptyTypeName */
14711472
def scalaClassName(cls: Symbol)(using Context): TypeName = cls.denot match

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1865,7 +1865,7 @@ object Types {
18651865
* @param alwaysDependent if true, always create a dependent function type.
18661866
*/
18671867
def toFunctionType(isJava: Boolean, dropLast: Int = 0, alwaysDependent: Boolean = false)(using Context): Type = this match {
1868-
case mt: MethodType if !mt.isParamDependent =>
1868+
case mt: MethodType if !mt.isParamDependent && !mt.hasErasedParams =>
18691869
val formals1 = if (dropLast == 0) mt.paramInfos else mt.paramInfos dropRight dropLast
18701870
val isContextual = mt.isContextualMethod && !ctx.erasedTypes
18711871
val result1 = mt.nonDependentResultApprox match {
@@ -1878,6 +1878,9 @@ object Types {
18781878
if alwaysDependent || mt.isResultDependent then
18791879
RefinedType(funType, nme.apply, mt)
18801880
else funType
1881+
case mt: MethodType if !mt.isParamDependent =>
1882+
assert(mt.hasErasedParams)
1883+
RefinedType(defn.ErasedFunctionType, nme.apply, mt)
18811884
}
18821885

18831886
/** The signature of this type. This is by default NotAMethod,

tests/run-custom-args/erased/quotes-reflection.check

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ method m2: (i: scala.Int) isGiven=false isImplicit=false erasedArgs=List(true)
44
method m3: (i: scala.Int, j: scala.Int) isGiven=false isImplicit=false erasedArgs=List(false, true)
55
method m4: (i: EC) isGiven=false isImplicit=false erasedArgs=List(true)
66
val l1: scala.ContextFunction1[scala.Int, scala.Int]
7-
val l2: scala.runtime.ErasedFunction with apply: (x$0: scala.Int @scala.annotation.internal.ErasedParam) isImplicit=false erasedParams=List(true)
8-
val l3: scala.runtime.ErasedFunction with apply: (x$0: scala.Int @scala.annotation.internal.ErasedParam) isImplicit=true erasedParams=List(true)
9-
val l4: scala.runtime.ErasedFunction with apply: (x$0: scala.Int, x$1: scala.Int @scala.annotation.internal.ErasedParam) isImplicit=false erasedParams=List(false, true)
10-
val l5: scala.runtime.ErasedFunction with apply: (x$0: EC @scala.annotation.internal.ErasedParam) isImplicit=false erasedParams=List(true)
7+
val l2: scala.runtime.ErasedFunction with apply: (x: scala.Int @scala.annotation.internal.ErasedParam) isImplicit=false erasedParams=List(true)
8+
val l3: scala.runtime.ErasedFunction with apply: (x: scala.Int @scala.annotation.internal.ErasedParam) isImplicit=true erasedParams=List(true)
9+
val l4: scala.runtime.ErasedFunction with apply: (x: scala.Int, y: scala.Int @scala.annotation.internal.ErasedParam) isImplicit=false erasedParams=List(false, true)
10+
val l5: scala.runtime.ErasedFunction with apply: (x: EC @scala.annotation.internal.ErasedParam) isImplicit=false erasedParams=List(true)

0 commit comments

Comments
 (0)