@@ -113,6 +113,7 @@ object SpaceEngine {
113113 def isSubspace (a : Space , b : Space )(using Context ): Boolean = a.isSubspace(b)
114114 def canDecompose (typ : Typ )(using Context ): Boolean = typ.canDecompose
115115 def decompose (typ : Typ )(using Context ): List [Typ ] = typ.decompose
116+ def nullSpace (using Context ): Space = Typ (ConstantType (Constant (null )), decomposed = false )
116117
117118 /** Simplify space such that a space equal to `Empty` becomes `Empty` */
118119 def computeSimplify (space : Space )(using Context ): Space = trace(i " simplify( $space) " )(space match {
@@ -690,7 +691,6 @@ object SpaceEngine {
690691 else NoType
691692 }.filter(_.exists)
692693 parts
693-
694694 case _ => ListOfNoType
695695 end rec
696696
@@ -904,6 +904,10 @@ object SpaceEngine {
904904 then project(OrType (selTyp, ConstantType (Constant (null )), soft = false ))
905905 else project(selTyp)
906906 )
907+ def projectPat (pat : Tree ): Space =
908+ // Project toplevel wildcard pattern to nullable
909+ if isNullable && isWildcardArg(pat) then Or (project(pat) :: nullSpace :: Nil )
910+ else project(pat)
907911
908912 var i = 0
909913 val len = cases.length
@@ -913,7 +917,7 @@ object SpaceEngine {
913917 while (i < len) {
914918 val CaseDef (pat, guard, _) = cases(i)
915919
916- val curr = trace(i " project( $pat) " )(project (pat))
920+ val curr = trace(i " project( $pat) " )(projectPat (pat))
917921
918922 val covered = trace(" covered" )(simplify(intersect(curr, targetSpace)))
919923
0 commit comments