File tree 6 files changed +91
-4
lines changed
compiler/src/dotty/tools/dotc
6 files changed +91
-4
lines changed Original file line number Diff line number Diff line change @@ -328,6 +328,9 @@ object TypeErasure {
328
328
isGenericArrayElement(tp.alias, isScala2)
329
329
case tp : TypeBounds =>
330
330
! fitsInJVMArray(tp.hi)
331
+ case tp : MatchType =>
332
+ val alts = tp.alternatives
333
+ alts.nonEmpty && ! fitsInJVMArray(alts.reduce(OrType (_, _, soft = true )))
331
334
case tp : TypeProxy =>
332
335
isGenericArrayElement(tp.translucentSuperType, isScala2)
333
336
case tp : AndType =>
Original file line number Diff line number Diff line change @@ -40,11 +40,28 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
40
40
val classTag = ref(defn.ClassTagModule )
41
41
val tag =
42
42
if defn.SpecialClassTagClasses .contains(sym) then
43
- classTag.select(sym.name.toTermName)
43
+ classTag.select(sym.name.toTermName).withSpan(span)
44
44
else
45
- val clsOfType = escapeJavaArray(erasure(tp))
46
- classTag.select(nme.apply).appliedToType(tp).appliedTo(clsOf(clsOfType))
47
- withNoErrors(tag.withSpan(span))
45
+ def clsOfType (tp : Type ): Type =
46
+ val tp1 = tp.dealias
47
+ if tp1.isMatch then
48
+ val matchTp = tp1.underlyingIterator.collect {
49
+ case mt : MatchType => mt
50
+ }.next
51
+ matchTp.alternatives.map(clsOfType) match
52
+ case ct1 :: cts if cts.forall(ct1 == _) => ct1
53
+ case _ => NoType
54
+ else
55
+ escapeJavaArray(erasure(tp))
56
+ val ctype = clsOfType(tp)
57
+ if ctype.exists then
58
+ classTag.select(nme.apply)
59
+ .appliedToType(tp)
60
+ .appliedTo(clsOf(ctype))
61
+ .withSpan(span)
62
+ else
63
+ EmptyTree
64
+ withNoErrors(tag)
48
65
case tp => EmptyTreeNoError
49
66
else EmptyTreeNoError
50
67
case _ => EmptyTreeNoError
Original file line number Diff line number Diff line change
1
+ -- Error: tests/neg/i15618.scala:17:44 ---------------------------------------------------------------------------------
2
+ 17 | def toArray: Array[ScalaType[T]] = Array() // error
3
+ | ^
4
+ | No ClassTag available for ScalaType[T]
5
+ |
6
+ | where: T is a type in class Tensor with bounds <: DType
7
+ |
8
+ |
9
+ | Note: a match type could not be fully reduced:
10
+ |
11
+ | trying to reduce ScalaType[T]
12
+ | failed since selector T
13
+ | does not match case Float16 => Float
14
+ | and cannot be shown to be disjoint from it either.
15
+ | Therefore, reduction cannot advance to the remaining cases
16
+ |
17
+ | case Float32 => Float
18
+ | case Int32 => Int
Original file line number Diff line number Diff line change
1
+ sealed abstract class DType
2
+ sealed class Float16 extends DType
3
+ sealed class Float32 extends DType
4
+ sealed class Int32 extends DType
5
+
6
+ object Float16 extends Float16
7
+ object Float32 extends Float32
8
+ object Int32 extends Int32
9
+
10
+ type ScalaType [U <: DType ] <: Int | Float = U match
11
+ case Float16 => Float
12
+ case Float32 => Float
13
+ case Int32 => Int
14
+
15
+ class Tensor [T <: DType ](dtype : T ):
16
+ def toSeq : Seq [ScalaType [T ]] = Seq ()
17
+ def toArray : Array [ScalaType [T ]] = Array () // error
18
+
19
+ @ main
20
+ def Test =
21
+ val t = Tensor (Float32 ) // Tensor[Float32]
22
+ println(t.toSeq.headOption) // works, Seq[Float]
23
+ println(t.toArray.headOption) // ClassCastException
Original file line number Diff line number Diff line change
1
+ None
2
+ None
Original file line number Diff line number Diff line change
1
+ sealed abstract class DType
2
+ sealed class Float16 extends DType
3
+ sealed class Float32 extends DType
4
+ sealed class Int32 extends DType
5
+
6
+ object Float16 extends Float16
7
+ object Float32 extends Float32
8
+ object Int32 extends Int32
9
+
10
+ type ScalaType [U <: DType ] <: Int | Float = U match
11
+ case Float16 => Float
12
+ case Float32 => Float
13
+ case Int32 => Int
14
+
15
+ abstract class Tensor [T <: DType ]:
16
+ def toArray : Array [ScalaType [T ]]
17
+
18
+ object FloatTensor extends Tensor [Float16 ]:
19
+ def toArray : Array [Float ] = Array (1 , 2 , 3 )
20
+
21
+ @ main
22
+ def Test =
23
+ val t = FloatTensor : Tensor [Float16 ] // Tensor[Float32]
24
+ println(t.toArray.headOption) // was ClassCastException
You can’t perform that action at this time.
0 commit comments