Skip to content

Commit

Permalink
Fix infinite loop in Mirror synthesis of unreducible match type (#20133)
Browse files Browse the repository at this point in the history
This regressed in f7e2e7c (present in
3.4.0).
The second commit fixes a soundness bug.
  • Loading branch information
smarter authored Apr 8, 2024
2 parents 133e709 + 4699140 commit 4daf050
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
4 changes: 3 additions & 1 deletion compiler/src/dotty/tools/dotc/typer/Synthesizer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,9 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
// avoid type aliases for tuples
Right(MirrorSource.GenericTuple(types))
case _ => reduce(tp.underlying)
case tp: MatchType => reduce(tp.normalized)
case tp: MatchType =>
val n = tp.tryNormalize
if n.exists then reduce(n) else Left(i"its subpart `$tp` is an unreducible match type.")
case _ => reduce(tp.superType)
case tp @ AndType(l, r) =>
for
Expand Down
13 changes: 13 additions & 0 deletions tests/neg/i19198.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import deriving.Mirror
import compiletime.summonInline

type DoesNotReduce[T] = T match
case String => Any

type DoesNotReduce2[T] <: T = T match
case String => T

class Foo
@main def Test: Unit =
summonInline[Mirror.Of[DoesNotReduce[Option[Int]]]] // error
summonInline[Mirror.Of[DoesNotReduce2[Option[Int]]]] // error

0 comments on commit 4daf050

Please sign in to comment.