Skip to content

Commit

Permalink
Normalize when verifying if TypeTestCasts are unchecked
Browse files Browse the repository at this point in the history
  • Loading branch information
EugeneFlesselle committed Apr 24, 2024
1 parent 05114dd commit abb6909
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ object TypeTestsCasts {
def recur(X: Type, P: Type): String = trace(s"recur(${X.show}, ${P.show})") {
(X <:< P) ||| P.dealias.match
case _: SingletonType => ""
case tp if tp.isMatchAlias => recur(X, tp.tryNormalize)
case _: TypeProxy
if isAbstract(P) => i"it refers to an abstract type member or type parameter"
case defn.ArrayOf(tpT) =>
Expand Down
25 changes: 25 additions & 0 deletions tests/pos/i13433c/A_1.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import scala.reflect.TypeTest

type Matcher[A] = A match { case String => A }

def patternMatch[A](a: Any)(using tt: TypeTest[Any, Matcher[A]]): Option[Matcher[A]] = {
// type T = RDF.Triple[Rdf]
a match {
case res: Matcher[A] => Some(res)
case _ => None
}
}

def patternMatchWithAlias[A](a: Any)(using tt: TypeTest[Any, Matcher[A]]): Option[Matcher[A]] = {
type T = Matcher[A]
a match {
case res: T => Some(res)
case _ => None
}
}

type S = String
type MS = Matcher[S]

type S2 = MS
type MS2 = Matcher[S2]
22 changes: 22 additions & 0 deletions tests/pos/i13433c/B_2.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//> using options -Xfatal-warnings -deprecation -feature

@main def main = {
println(patternMatch[String]("abc"))
println(patternMatchWithAlias[String]("abc"))
println(patternMatch[String]("abc")(using (s: Any) => {
if s.isInstanceOf[Matcher[String]] then Some[s.type & Matcher[String]](s.asInstanceOf[s.type & Matcher[String]]) else None }))
println(patternMatchWithAlias[String]("abc")(using (s: Any) => {
if s.isInstanceOf[Matcher[String]] then Some[s.type & Matcher[String]](s.asInstanceOf[s.type & Matcher[String]]) else None }))

println(patternMatch[String](1))
println(patternMatchWithAlias[String](1))

println(patternMatch[String]("abc")(using (s: Any) => {
if s.isInstanceOf[S] then Some[s.type & Matcher[String]](s.asInstanceOf[s.type & Matcher[String]]) else None}))
println(patternMatch[String]("abc")(using (s: Any) => {
if s.isInstanceOf[MS] then Some[s.type & Matcher[String]](s.asInstanceOf[s.type & Matcher[String]]) else None}))
println(patternMatch[String]("abc")(using (s: Any) => {
if s.isInstanceOf[S2] then Some[s.type & Matcher[String]](s.asInstanceOf[s.type & Matcher[String]]) else None}))
println(patternMatch[String]("abc")(using (s: Any) => {
if s.isInstanceOf[MS2] then Some[s.type & Matcher[String]](s.asInstanceOf[s.type & Matcher[String]]) else None}))
}

0 comments on commit abb6909

Please sign in to comment.