Skip to content

Commit d37dc51

Browse files
committed
Fix isSpecializableFunction: compare symbols, not types
1 parent 759daf2 commit d37dc51

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

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

+25-14
Original file line numberDiff line numberDiff line change
@@ -984,28 +984,39 @@ class Definitions {
984984
isNonDepFunctionType(tp.dropDependentRefinement)
985985

986986
// Specialized type parameters defined for scala.Function{0,1,2}.
987-
private lazy val Function1SpecializedParams: collection.Set[Type] =
987+
lazy val Function1SpecializedParamTypes: collection.Set[TypeRef] =
988988
Set(IntType, LongType, FloatType, DoubleType)
989-
private lazy val Function2SpecializedParams: collection.Set[Type] =
989+
lazy val Function2SpecializedParamTypes: collection.Set[TypeRef] =
990990
Set(IntType, LongType, DoubleType)
991-
private lazy val Function0SpecializedReturns: collection.Set[Type] =
992-
ScalaNumericValueTypeList.toSet[Type] + UnitType + BooleanType
993-
private lazy val Function1SpecializedReturns: collection.Set[Type] =
991+
lazy val Function0SpecializedReturnTypes: collection.Set[TypeRef] =
992+
ScalaNumericValueTypeList.toSet + UnitType + BooleanType
993+
lazy val Function1SpecializedReturnTypes: collection.Set[TypeRef] =
994994
Set(UnitType, BooleanType, IntType, FloatType, LongType, DoubleType)
995-
private lazy val Function2SpecializedReturns: collection.Set[Type] =
996-
Function1SpecializedReturns
995+
lazy val Function2SpecializedReturnTypes: collection.Set[TypeRef] =
996+
Function1SpecializedReturnTypes
997+
998+
lazy val Function1SpecializedParamClasses =
999+
new PerRun[collection.Set[Symbol]](implicit ctx => Function1SpecializedParamTypes.map(_.symbol))
1000+
lazy val Function2SpecializedParamClasses =
1001+
new PerRun[collection.Set[Symbol]](implicit ctx => Function2SpecializedParamTypes.map(_.symbol))
1002+
lazy val Function0SpecializedReturnClasses =
1003+
new PerRun[collection.Set[Symbol]](implicit ctx => Function0SpecializedReturnTypes.map(_.symbol))
1004+
lazy val Function1SpecializedReturnClasses =
1005+
new PerRun[collection.Set[Symbol]](implicit ctx => Function1SpecializedReturnTypes.map(_.symbol))
1006+
lazy val Function2SpecializedReturnClasses =
1007+
new PerRun[collection.Set[Symbol]](implicit ctx => Function2SpecializedReturnTypes.map(_.symbol))
9971008

9981009
def isSpecializableFunction(cls: ClassSymbol, paramTypes: List[Type], retType: Type)(implicit ctx: Context) =
999-
isFunctionClass(cls) && (paramTypes match {
1010+
paramTypes.length <= 2 && cls.derivesFrom(FunctionClass(paramTypes.length)) && (paramTypes match {
10001011
case Nil =>
1001-
Function0SpecializedReturns.contains(retType)
1012+
Function0SpecializedReturnClasses().contains(retType.typeSymbol)
10021013
case List(paramType0) =>
1003-
Function1SpecializedParams.contains(paramType0) &&
1004-
Function1SpecializedReturns.contains(retType)
1014+
Function1SpecializedParamClasses().contains(paramType0.typeSymbol) &&
1015+
Function1SpecializedReturnClasses().contains(retType.typeSymbol)
10051016
case List(paramType0, paramType1) =>
1006-
Function2SpecializedParams.contains(paramType0) &&
1007-
Function2SpecializedParams.contains(paramType1) &&
1008-
Function2SpecializedReturns.contains(retType)
1017+
Function2SpecializedParamClasses().contains(paramType0.typeSymbol) &&
1018+
Function2SpecializedParamClasses().contains(paramType1.typeSymbol) &&
1019+
Function2SpecializedReturnClasses().contains(retType.typeSymbol)
10091020
case _ =>
10101021
false
10111022
})

0 commit comments

Comments
 (0)