Skip to content

Commit d35f356

Browse files
committed
Add ClassTag.apply warning
1 parent 0ec539a commit d35f356

File tree

9 files changed

+52
-1
lines changed

9 files changed

+52
-1
lines changed

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -797,9 +797,12 @@ class Typer extends Namer
797797
case _ =>
798798
None
799799
}
800-
withTag(defn.TypeTestClass.typeRef.appliedTo(pt, tref))
800+
val tag = withTag(defn.TypeTestClass.typeRef.appliedTo(pt, tref))
801801
.orElse(withTag(defn.ClassTagClass.typeRef.appliedTo(tref)))
802802
.getOrElse(tree)
803+
if tag.symbol.owner == defn.ClassTagClass && config.Feature.sourceVersion.isAtLeast(config.SourceVersion.`3.1`) then
804+
report.warning("Use of ClassTag for type testing may be unsound. Consider using `reflect.Typable` instead.", tree.srcPos)
805+
tag
803806
case _ => tree
804807
}
805808

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.language.`3.0-migration`
2+
import scala.reflect.ClassTag
3+
4+
def f3_0m[T: ClassTag](x: Any): Unit =
5+
x match
6+
case _: T =>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.language.`3.0`
2+
import scala.reflect.ClassTag
3+
4+
def f3_0[T: ClassTag](x: Any): Unit =
5+
x match
6+
case _: T =>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.language.`3.1-migration`
2+
import scala.reflect.ClassTag
3+
4+
def f3_1m[T: ClassTag](x: Any): Unit =
5+
x match
6+
case _: T => // error
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.language.`3.1`
2+
import scala.reflect.ClassTag
3+
4+
def f3_1[T: ClassTag](x: Any): Unit =
5+
x match
6+
case _: T => // error
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.language.`3.0-migration`
2+
import scala.reflect.ClassTag
3+
4+
def f3_0m[T: ClassTag](x: Any): Unit =
5+
x match
6+
case _: T =>

tests/pos/classtag-typetest/3_0.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.language.`3.0`
2+
import scala.reflect.ClassTag
3+
4+
def f3_0[T: ClassTag](x: Any): Unit =
5+
x match
6+
case _: T =>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.language.`3.1-migration`
2+
import scala.reflect.ClassTag
3+
4+
def f3_1m[T: ClassTag](x: Any): Unit =
5+
x match
6+
case _: T =>

tests/pos/classtag-typetest/3_1.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import scala.language.`3.1`
2+
import scala.reflect.ClassTag
3+
4+
def f3_1[T: ClassTag](x: Any): Unit =
5+
x match
6+
case _: T =>

0 commit comments

Comments
 (0)