Skip to content

Commit 574f4bb

Browse files
committed
Fix wildcard handling in Inliner
We could not reduce a pattern with wildcard type arguments because these were not treated as GADT bound variables but as abstract types.
1 parent c3160a3 commit 574f4bb

File tree

2 files changed

+35
-35
lines changed

2 files changed

+35
-35
lines changed

compiler/src/dotty/tools/dotc/typer/Inliner.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,7 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
707707
val getBoundVars = new TreeAccumulator[List[TypeSymbol]] {
708708
def apply(syms: List[TypeSymbol], t: Tree)(implicit ctx: Context) = {
709709
val syms1 = t match {
710-
case t: Bind if t.symbol.isType && t.name != tpnme.WILDCARD =>
710+
case t: Bind if t.symbol.isType =>
711711
t.symbol.asType :: syms
712712
case _ =>
713713
syms
@@ -734,7 +734,7 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
734734
// ConstraintHandler#approximation does. However, this only works for constrained paramrefs
735735
// not GADT-bound variables. Hopefully we will get some way to improve this when we
736736
// re-implement GADTs in terms of constraints.
737-
bindingsBuf += TypeDef(bv)
737+
if (bv.name != nme.WILDCARD) bindingsBuf += TypeDef(bv)
738738
}
739739
reducePattern(bindingsBuf, scrut, pat1)
740740
}

tests/run/typeclass-derivation2.scala

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -73,55 +73,55 @@ object Pair {
7373

7474
// A typeclass
7575
trait Eq[T] {
76-
def equals(x: T, y: T): Boolean
76+
def eql(x: T, y: T): Boolean
7777
}
7878

7979
object Eq {
8080
import scala.typelevel._
8181
import Deriving._
8282

83-
inline def tryEquals[T](x: T, y: T) = implicit match {
84-
case eq: Eq[T] => eq.equals(x, y)
83+
inline def tryEql[T](x: T, y: T) = implicit match {
84+
case eq: Eq[T] => eq.eql(x, y)
8585
}
8686

87-
inline def equalsElems[Elems <: Tuple](xs: Array[Object], ys: Array[Object], n: Int): Boolean =
87+
inline def eqlElems[Elems <: Tuple](xs: Array[Object], ys: Array[Object], n: Int): Boolean =
8888
inline erasedValue[Elems] match {
8989
case _: (elem *: elems1) =>
90-
tryEquals[elem](xs(n).asInstanceOf, ys(n).asInstanceOf) &&
91-
equalsElems[elems1](xs, ys, n + 1)
90+
tryEql[elem](xs(n).asInstanceOf, ys(n).asInstanceOf) &&
91+
eqlElems[elems1](xs, ys, n + 1)
9292
case _: Unit =>
9393
true
9494
}
9595

96-
inline def equalsCase[T, Elems <: Tuple](mapper: GenericMapper[T], x: T, y: T) =
97-
equalsElems[Elems](mapper.toGenericCase(x).elems, mapper.toGenericCase(y).elems, 0)
96+
inline def eqlCase[T, Elems <: Tuple](mapper: GenericMapper[T], x: T, y: T) =
97+
eqlElems[Elems](mapper.toGenericCase(x).elems, mapper.toGenericCase(y).elems, 0)
9898

99-
inline def equalsCases[T, Alts <: Tuple](mapper: GenericMapper[T], x: T, y: T): Boolean =
99+
inline def eqlCases[T, Alts <: Tuple](mapper: GenericMapper[T], x: T, y: T): Boolean =
100100
inline erasedValue[Alts] match {
101101
case _: (Shape.Case[alt, elems] *: alts1) =>
102102
x match {
103103
case x: `alt` =>
104104
y match {
105-
case y: `alt` => equalsCase[T, elems](mapper, x, y)
105+
case y: `alt` => eqlCase[T, elems](mapper, x, y)
106106
case _ => false
107107
}
108-
case _ => equalsCases[T, alts1](mapper, x, y)
108+
case _ => eqlCases[T, alts1](mapper, x, y)
109109
}
110110
case _: Unit =>
111111
false
112112
}
113113

114-
inline def derived[T, S <: Shape](implicit ev: HasShape[T, S]): Eq[T] = new {
115-
def equals(x: T, y: T): Boolean = inline erasedValue[S] match {
114+
inline def derived[T, S <: Shape](implicit ev: HasShape[T, S]) <: Eq[T] = new {
115+
def eql(x: T, y: T): Boolean = inline erasedValue[S] match {
116116
case _: Shape.Cases[alts] =>
117-
equalsCases[T, alts](ev, x, y)
118-
case _: Shape.Case[alt, elems] =>
119-
equalsCase[T, elems](ev, x, y)
117+
eqlCases[T, alts](ev, x, y)
118+
case _: Shape.Case[_, elems] =>
119+
eqlCase[T, elems](ev, x, y)
120120
}
121121
}
122122

123123
implicit object IntEq extends Eq[Int] {
124-
def equals(x: Int, y: Int) = x == y
124+
def eql(x: Int, y: Int) = x == y
125125
}
126126
}
127127

@@ -185,7 +185,7 @@ object Pickler {
185185

186186
inline def unpickleCases[T, Alts <: Tuple](mapper: GenericMapper[T], buf: mutable.ListBuffer[Int], ordinal: Int, n: Int): T =
187187
inline erasedValue[Alts] match {
188-
case _: (Shape.Case[alt, elems] *: alts1) =>
188+
case _: (Shape.Case[_, elems] *: alts1) =>
189189
if (n == ordinal) unpickleCase[T, elems](mapper, buf, ordinal)
190190
else unpickleCases[T, alts1](mapper, buf, ordinal, n + 1)
191191
case _ =>
@@ -196,13 +196,13 @@ object Pickler {
196196
def pickle(buf: mutable.ListBuffer[Int], x: T): Unit = inline erasedValue[S] match {
197197
case _: Shape.Cases[alts] =>
198198
pickleCases[T, alts](ev, buf, x, 0)
199-
case _: Shape.Case[alt, elems] =>
199+
case _: Shape.Case[_, elems] =>
200200
pickleCase[T, elems](ev, buf, x)
201201
}
202202
def unpickle(buf: mutable.ListBuffer[Int]): T = inline erasedValue[S] match {
203203
case _: Shape.Cases[alts] =>
204204
unpickleCases[T, alts](ev, buf, nextInt(buf), 0)
205-
case _: Shape.Case[alt, elems] =>
205+
case _: Shape.Case[_, elems] =>
206206
unpickleCase[T, elems](ev, buf, 0)
207207
}
208208
}
@@ -219,18 +219,18 @@ object Test extends App {
219219
val eq = implicitly[Eq[Lst[Int]]]
220220
val xs = Lst.Cons(11, Lst.Cons(22, Lst.Cons(33, Lst.Nil)))
221221
val ys = Lst.Cons(11, Lst.Cons(22, Lst.Nil))
222-
assert(eq.equals(xs, xs))
223-
assert(!eq.equals(xs, ys))
224-
assert(!eq.equals(ys, xs))
225-
assert(eq.equals(ys, ys))
222+
assert(eq.eql(xs, xs))
223+
assert(!eq.eql(xs, ys))
224+
assert(!eq.eql(ys, xs))
225+
assert(eq.eql(ys, ys))
226226

227227
val eq2 = implicitly[Eq[Lst[Lst[Int]]]]
228228
val xss = Lst.Cons(xs, Lst.Cons(ys, Lst.Nil))
229229
val yss = Lst.Cons(xs, Lst.Nil)
230-
assert(eq2.equals(xss, xss))
231-
assert(!eq2.equals(xss, yss))
232-
assert(!eq2.equals(yss, xss))
233-
assert(eq2.equals(yss, yss))
230+
assert(eq2.eql(xss, xss))
231+
assert(!eq2.eql(xss, yss))
232+
assert(!eq2.eql(yss, xss))
233+
assert(eq2.eql(yss, yss))
234234

235235
val buf = new mutable.ListBuffer[Int]
236236
val pkl = implicitly[Pickler[Lst[Int]]]
@@ -239,28 +239,28 @@ object Test extends App {
239239
val xs1 = pkl.unpickle(buf)
240240
println(xs1)
241241
assert(xs1 == xs)
242-
assert(eq.equals(xs1, xs))
242+
assert(eq.eql(xs1, xs))
243243

244244
val pkl2 = implicitly[Pickler[Lst[Lst[Int]]]]
245245
pkl2.pickle(buf, xss)
246246
println(buf)
247247
val xss1 = pkl2.unpickle(buf)
248248
println(xss1)
249249
assert(xss == xss1)
250-
assert(eq2.equals(xss, xss1))
250+
assert(eq2.eql(xss, xss1))
251251

252252
val p1 = Pair(1, 2)
253253
val p2 = Pair(1, 2)
254254
val p3 = Pair(2, 1)
255255
val eqp = implicitly[Eq[Pair[Int]]]
256-
assert(eqp.equals(p1, p2))
257-
assert(!eqp.equals(p2, p3))
256+
assert(eqp.eql(p1, p2))
257+
assert(!eqp.eql(p2, p3))
258258

259259
val pklp = implicitly[Pickler[Pair[Int]]]
260260
pklp.pickle(buf, p1)
261261
println(buf)
262262
val p1a = pklp.unpickle(buf)
263263
println(p1a)
264264
assert(p1 == p1a)
265-
assert(eqp.equals(p1, p1a))
265+
assert(eqp.eql(p1, p1a))
266266
}

0 commit comments

Comments
 (0)