Skip to content

Commit

Permalink
Avoid NPE in simplify
Browse files Browse the repository at this point in the history
Fixes #15272

There's no crash anymore, but #15272 still does not compile.
  • Loading branch information
odersky committed May 29, 2022
1 parent b61036b commit c55fa8c
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 5 deletions.
10 changes: 6 additions & 4 deletions compiler/src/dotty/tools/dotc/core/OrderingConstraint.scala
Expand Up @@ -148,7 +148,7 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
private def paramCount(entries: Array[Type]) = entries.length >> 1

/** The type variable corresponding to parameter numbered `n`, null if none was created */
private def typeVar(entries: Array[Type], n: Int): Type =
private def typeVar(entries: Array[Type], n: Int): Type | Null =
entries(paramCount(entries) + n)

/** The `boundsMap` entry corresponding to `param` */
Expand Down Expand Up @@ -203,11 +203,13 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
def nonParamBounds(param: TypeParamRef)(using Context): TypeBounds =
entry(param).bounds

def typeVarOfParam(param: TypeParamRef): Type = {
def typeVarOfParam(param: TypeParamRef): Type =
val entries = boundsMap(param.binder)
if entries == null then NoType
else typeVar(entries, param.paramNum)
}
else
val tvar = typeVar(entries, param.paramNum)
if tvar == null then NoType
else tvar

// ---------- Adding TypeLambdas --------------------------------------------------

Expand Down
2 changes: 1 addition & 1 deletion compiler/src/dotty/tools/dotc/core/TypeOps.scala
Expand Up @@ -145,7 +145,7 @@ object TypeOps:
if normed.exists then normed else tp.map(simplify(_, theMap))
case tp: TypeParamRef =>
val tvar = ctx.typerState.constraint.typeVarOfParam(tp)
if (tvar.exists) tvar else tp
if tvar.exists then tvar else tp
case _: ThisType | _: BoundType =>
tp
case tp: AliasingBounds =>
Expand Down
11 changes: 11 additions & 0 deletions tests/neg/i15272.scala
@@ -0,0 +1,11 @@
sealed trait EdgeN[+NT]
object EdgeN:
case class Head[+NT, +From <: NT, +To <: NT] (from: From, to: To ) extends EdgeN[NT]
case class Cons[+NT, +From <: NT, +ToE <: EdgeN[NT]](from: From, to: ToE) extends EdgeN[NT]
final type InNodesTupleOf[NT, E <: EdgeN[NT]] <: Tuple = E match
case Cons[nt,from,toE] => from *: InNodesTupleOf[nt,toE]
case Head[nt,from ,to] => from *: EmptyTuple
def inNodesTuple[NT,E <: EdgeN[NT]](edge: E): InNodesTupleOf[NT,E] = edge match
case e: Cons[nt,from,toE] => e.from *: inNodesTuple[nt,toE](e.to) // error
case e: Head[nt,from,to] => e.from *: EmptyTuple
end EdgeN

0 comments on commit c55fa8c

Please sign in to comment.