Skip to content

Commit

Permalink
Reuse & switch to UncheckedTypePattern
Browse files Browse the repository at this point in the history
  • Loading branch information
dwijnand committed Sep 4, 2023
1 parent 10c83bd commit ee6d386
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 15 deletions.
4 changes: 2 additions & 2 deletions compiler/src/dotty/tools/dotc/reporting/messages.scala
Original file line number Diff line number Diff line change
Expand Up @@ -895,9 +895,9 @@ extends Message(PatternMatchExhaustivityID) {
}
}

class UncheckedTypePattern(msgFn: => String)(using Context)
class UncheckedTypePattern(argType: Type, whyNot: String)(using Context)
extends PatternMatchMsg(UncheckedTypePatternID) {
def msg(using Context) = msgFn
def msg(using Context) = i"the type test for $argType cannot be checked at runtime because $whyNot"
def explain(using Context) =
i"""|Type arguments and type refinements are erased during compile time, thus it's
|impossible to check them at run-time.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ object TypeTestsCasts {
if !isTrusted && !isUnchecked then
val whyNot = whyUncheckable(expr.tpe, argType, tree.span)
if whyNot.nonEmpty then
report.uncheckedWarning(em"the type test for $argType cannot be checked at runtime because $whyNot", expr.srcPos)
report.uncheckedWarning(UncheckedTypePattern(argType, whyNot), expr.srcPos)
transformTypeTest(expr, argType,
flagUnrelated = enclosingInlineds.isEmpty) // if test comes from inlined code, dont't flag it even if it always false
}
Expand Down
4 changes: 3 additions & 1 deletion tests/neg/15981.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
-- Error: tests/neg/15981.scala:4:45 -----------------------------------------------------------------------------------
-- [E092] Pattern Match Error: tests/neg/15981.scala:4:45 --------------------------------------------------------------
4 | override def equals(any: Any): Boolean = any.isInstanceOf[PosInt] // error
| ^^^
| the type test for PosInt cannot be checked at runtime because it's a local class
|
| longer explanation available when compiling with `-explain`
8 changes: 6 additions & 2 deletions tests/neg/i12253.check
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
-- Error: tests/neg/i12253.scala:13:10 ---------------------------------------------------------------------------------
-- [E092] Pattern Match Error: tests/neg/i12253.scala:13:10 ------------------------------------------------------------
13 | case extractors.InlinedLambda(_, Select(_, name)) => Expr(name) // error // error
| ^
|the type test for extractors.q2.reflect.Term cannot be checked at runtime because it refers to an abstract type member or type parameter
-- Error: tests/neg/i12253.scala:13:38 ---------------------------------------------------------------------------------
|
| longer explanation available when compiling with `-explain`
-- [E092] Pattern Match Error: tests/neg/i12253.scala:13:38 ------------------------------------------------------------
13 | case extractors.InlinedLambda(_, Select(_, name)) => Expr(name) // error // error
| ^
|the type test for q1.reflect.Select cannot be checked at runtime because it refers to an abstract type member or type parameter
|
| longer explanation available when compiling with `-explain`
there was 1 deprecation warning; re-run with -deprecation for details
4 changes: 3 additions & 1 deletion tests/neg/i16728.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
-- Error: tests/neg/i16728.scala:18:11 ---------------------------------------------------------------------------------
-- [E092] Pattern Match Error: tests/neg/i16728.scala:18:11 ------------------------------------------------------------
18 | case tx : C[Int]#X => // error
| ^
| the type test for C[Int] cannot be checked at runtime because its type arguments can't be determined from A
|
| longer explanation available when compiling with `-explain`
28 changes: 21 additions & 7 deletions tests/neg/i4812.check
Original file line number Diff line number Diff line change
@@ -1,28 +1,42 @@
-- Error: tests/neg/i4812.scala:8:11 -----------------------------------------------------------------------------------
-- [E092] Pattern Match Error: tests/neg/i4812.scala:8:11 --------------------------------------------------------------
8 | case prev: A => // error: the type test for A cannot be checked at runtime
| ^
| the type test for A cannot be checked at runtime because it's a local class
-- Error: tests/neg/i4812.scala:18:11 ----------------------------------------------------------------------------------
|
| longer explanation available when compiling with `-explain`
-- [E092] Pattern Match Error: tests/neg/i4812.scala:18:11 -------------------------------------------------------------
18 | case prev: A => // error: the type test for A cannot be checked at runtime
| ^
| the type test for A cannot be checked at runtime because it's a local class
-- Error: tests/neg/i4812.scala:28:11 ----------------------------------------------------------------------------------
|
| longer explanation available when compiling with `-explain`
-- [E092] Pattern Match Error: tests/neg/i4812.scala:28:11 -------------------------------------------------------------
28 | case prev: A => // error: the type test for A cannot be checked at runtime
| ^
| the type test for A cannot be checked at runtime because it's a local class
-- Error: tests/neg/i4812.scala:38:11 ----------------------------------------------------------------------------------
|
| longer explanation available when compiling with `-explain`
-- [E092] Pattern Match Error: tests/neg/i4812.scala:38:11 -------------------------------------------------------------
38 | case prev: A => // error: the type test for A cannot be checked at runtime
| ^
| the type test for A cannot be checked at runtime because it's a local class
-- Error: tests/neg/i4812.scala:50:13 ----------------------------------------------------------------------------------
|
| longer explanation available when compiling with `-explain`
-- [E092] Pattern Match Error: tests/neg/i4812.scala:50:13 -------------------------------------------------------------
50 | case prev: A => // error: the type test for A cannot be checked at runtime
| ^
| the type test for A cannot be checked at runtime because it's a local class
-- Error: tests/neg/i4812.scala:60:11 ----------------------------------------------------------------------------------
|
| longer explanation available when compiling with `-explain`
-- [E092] Pattern Match Error: tests/neg/i4812.scala:60:11 -------------------------------------------------------------
60 | case prev: A => // error: the type test for A cannot be checked at runtime
| ^
| the type test for A cannot be checked at runtime because it's a local class
-- Error: tests/neg/i4812.scala:96:11 ----------------------------------------------------------------------------------
|
| longer explanation available when compiling with `-explain`
-- [E092] Pattern Match Error: tests/neg/i4812.scala:96:11 -------------------------------------------------------------
96 | case x: B => // error: the type test for B cannot be checked at runtime
| ^
| the type test for B cannot be checked at runtime because it's a local class
|
| longer explanation available when compiling with `-explain`
4 changes: 3 additions & 1 deletion tests/neg/nowarn.check
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,12 @@ Matching filters for @nowarn or -Wconf:
49 |def t7c = f // warning (deprecation)
| ^
| method f is deprecated
-- Unchecked Warning: tests/neg/nowarn.scala:55:7 ----------------------------------------------------------------------
-- [E092] Pattern Match Unchecked Warning: tests/neg/nowarn.scala:55:7 -------------------------------------------------
55 | case _: List[Int] => 0 // warning (patmat, unchecked)
| ^
|the type test for List[Int] cannot be checked at runtime because its type arguments can't be determined from Any
|
| longer explanation available when compiling with `-explain`
-- Error: tests/neg/nowarn.scala:33:1 ----------------------------------------------------------------------------------
33 |@nowarn("id=1") def t4d = try 1 // error and warning (unused nowarn, wrong id)
|^^^^^^^^^^^^^^^
Expand Down

0 comments on commit ee6d386

Please sign in to comment.