Skip to content

Commit 5a5d294

Browse files
committed
Stratify classTags in DottyPredef
Test case in pending/run/array-addition.scala. The problem was that implicit search failed to insert `genericArrayOps` around `Array()`. The reason was that the implicit parameter for `genericArrayOps` was ambiguous, multiple `classTag` methods matched the expected type `ClassTag[?T >: Nothing]`. Stratifying ClassTags in DottyPredef into layers according to implicit priority avoids this problem. This is a temporary solution until we have proper ClassTag handling in place.
1 parent 75f4b71 commit 5a5d294

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

src/dotty/DottyPredef.scala

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,34 @@ import scala.reflect.ClassTag
44
import scala.reflect.runtime.universe.TypeTag
55
import scala.Predef.??? // this is currently ineffective, because of #530
66

7-
object DottyPredef {
8-
/** implicits for ClassTag and TypeTag. Should be implemented with macros */
7+
abstract class I1 {
98
implicit def classTag[T]: ClassTag[T] = scala.Predef.???
109
implicit def typeTag[T]: TypeTag[T] = scala.Predef.???
11-
12-
13-
/** ClassTags for final classes */
10+
implicit val DoubleClassTag: ClassTag[Double] = ClassTag.Double
11+
}
12+
abstract class I2 extends I1 {
13+
implicit val FloatClassTag: ClassTag[Double] = ClassTag.Double
14+
}
15+
abstract class I3 extends I2 {
16+
implicit val LongClassTag: ClassTag[Long] = ClassTag.Long
17+
}
18+
abstract class I4 extends I3 {
1419
implicit val IntClassTag: ClassTag[Int] = ClassTag.Int
15-
implicit val ByteClassTag: ClassTag[Byte] = ClassTag.Byte
20+
}
21+
abstract class I5 extends I4 {
1622
implicit val ShortClassTag: ClassTag[Short] = ClassTag.Short
23+
}
24+
abstract class I6 extends I5 {
25+
implicit val ByteClassTag: ClassTag[Byte] = ClassTag.Byte
1726
implicit val CharClassTag: ClassTag[Char] = ClassTag.Char
18-
implicit val LongClassTag: ClassTag[Long] = ClassTag.Long
19-
implicit val FloatClassTag: ClassTag[Float] = ClassTag.Float
20-
implicit val DoubleClassTag: ClassTag[Double] = ClassTag.Double
2127
implicit val BooleanClassTag: ClassTag[Boolean] = ClassTag.Boolean
2228
implicit val UnitClassTag: ClassTag[Unit] = ClassTag.Unit
2329
implicit val NullClassTag: ClassTag[Null] = ClassTag.Null
30+
}
31+
32+
/** implicits for ClassTag and TypeTag. Should be implemented with macros */
33+
object DottyPredef extends I6 {
34+
35+
/** ClassTags for final classes */
2436
implicit val NothingClassTag: ClassTag[Nothing] = ClassTag.Nothing
2537
}

0 commit comments

Comments
 (0)