Skip to content

Commit 2beb67e

Browse files
Do match type reduction atPhaseNoLater than ElimOpaque
If a match type pattern is an opaque type, we use its bounds when checking the validity of the pattern. Following the ElimOpaque phase however, the pattern is beta-reduced (as normal applied type aliases), which may result in an illegal pattern.
1 parent 2329236 commit 2beb67e

File tree

3 files changed

+16
-1
lines changed

3 files changed

+16
-1
lines changed

compiler/src/dotty/tools/dotc/core/Phases.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ object Phases {
220220
private var myPatmatPhase: Phase = uninitialized
221221
private var myElimRepeatedPhase: Phase = uninitialized
222222
private var myElimByNamePhase: Phase = uninitialized
223+
private var myElimOpaquePhase: Phase = uninitialized
223224
private var myExtensionMethodsPhase: Phase = uninitialized
224225
private var myExplicitOuterPhase: Phase = uninitialized
225226
private var myGettersPhase: Phase = uninitialized
@@ -245,6 +246,7 @@ object Phases {
245246
final def patmatPhase: Phase = myPatmatPhase
246247
final def elimRepeatedPhase: Phase = myElimRepeatedPhase
247248
final def elimByNamePhase: Phase = myElimByNamePhase
249+
final def elimOpaquePhase: Phase = myElimOpaquePhase
248250
final def extensionMethodsPhase: Phase = myExtensionMethodsPhase
249251
final def explicitOuterPhase: Phase = myExplicitOuterPhase
250252
final def gettersPhase: Phase = myGettersPhase
@@ -272,6 +274,7 @@ object Phases {
272274
myRefChecksPhase = phaseOfClass(classOf[RefChecks])
273275
myElimRepeatedPhase = phaseOfClass(classOf[ElimRepeated])
274276
myElimByNamePhase = phaseOfClass(classOf[ElimByName])
277+
myElimOpaquePhase = phaseOfClass(classOf[ElimOpaque])
275278
myExtensionMethodsPhase = phaseOfClass(classOf[ExtensionMethods])
276279
myErasurePhase = phaseOfClass(classOf[Erasure])
277280
myElimErasedValueTypePhase = phaseOfClass(classOf[ElimErasedValueType])
@@ -511,6 +514,7 @@ object Phases {
511514
def refchecksPhase(using Context): Phase = ctx.base.refchecksPhase
512515
def elimRepeatedPhase(using Context): Phase = ctx.base.elimRepeatedPhase
513516
def elimByNamePhase(using Context): Phase = ctx.base.elimByNamePhase
517+
def elimOpaquePhase(using Context): Phase = ctx.base.elimOpaquePhase
514518
def extensionMethodsPhase(using Context): Phase = ctx.base.extensionMethodsPhase
515519
def explicitOuterPhase(using Context): Phase = ctx.base.explicitOuterPhase
516520
def gettersPhase(using Context): Phase = ctx.base.gettersPhase

compiler/src/dotty/tools/dotc/core/Types.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5026,7 +5026,7 @@ object Types extends TypeUtils {
50265026

50275027
private def thisMatchType = this
50285028

5029-
def reduced(using Context): Type = {
5029+
def reduced(using Context): Type = atPhaseNoLater(elimOpaquePhase) {
50305030

50315031
def contextInfo(tp: Type): Type = tp match {
50325032
case tp: TypeParamRef =>

tests/pos/i19434.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
object Test:
3+
4+
object Named:
5+
opaque type Named[name <: String & Singleton, A] >: A = A
6+
7+
type DropNames[T <: Tuple] = T match
8+
case Named.Named[_, x] *: xs => x *: DropNames[xs]
9+
case _ => T
10+
11+
def f[T <: Tuple]: DropNames[T] = ???

0 commit comments

Comments
 (0)