@@ -345,8 +345,8 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
345345 OrType (erase(tp1), erase(tp2))
346346 case AndType (tp1, tp2) =>
347347 AndType (erase(tp1), erase(tp2))
348- case tp : RefinedType =>
349- tp.derivedRefinedType(erase(tp. parent), tp. refinedName, WildcardType )
348+ case tp @ RefinedType (parent, refinedName, _) if refinedName.isTermName => // see pos/dependent-extractors.scala
349+ tp.derivedRefinedType(erase(parent), refinedName, WildcardType )
350350 case _ => tp
351351 }
352352
@@ -842,7 +842,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
842842 flatten(s).map(doShow(_, false )).distinct.mkString(" , " )
843843 }
844844
845- def checkable ( tree : Match ): Boolean = {
845+ private def exhaustivityCheckable ( sel : Tree ): Boolean = {
846846 // Possible to check everything, but be compatible with scalac by default
847847 def isCheckable (tp : Type ): Boolean =
848848 ! tp.hasAnnotation(defn.UncheckedAnnot ) && {
@@ -860,9 +860,8 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
860860 (defn.isTupleType(tpw) && tpw.argInfos.exists(isCheckable(_)))
861861 }
862862
863- val Match (sel, cases) = tree
864863 val res = isCheckable(sel.tpe)
865- debug.println(s " checkable: ${sel.show} = $res" )
864+ debug.println(s " exhaustivity checkable: ${sel.show} = $res" )
866865 res
867866 }
868867
@@ -880,6 +879,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
880879 val Match (sel, cases) = _match
881880 val selTyp = sel.tpe.widen.dealias
882881
882+ if (! exhaustivityCheckable(sel)) return
883883
884884 val patternSpace = cases.map({ x =>
885885 val space = project(x.pat)
@@ -897,11 +897,15 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
897897 ctx.warning(PatternMatchExhaustivity (show(Or (uncovered))), sel.pos)
898898 }
899899
900+ private def redundancyCheckable (sel : Tree ): Boolean =
901+ ! sel.tpe.hasAnnotation(defn.UncheckedAnnot )
902+
900903 def checkRedundancy (_match : Match ): Unit = {
901904 val Match (sel, cases) = _match
902- // ignore selector type for now
903905 val selTyp = sel.tpe.widen.dealias
904906
907+ if (! redundancyCheckable(sel)) return
908+
905909 (0 until cases.length).foreach { i =>
906910 // in redundancy check, take guard as false in order to soundly approximate
907911 val prevs =
0 commit comments