From c736c3e61388b7df2e8edc3eea871ea6a9276520 Mon Sep 17 00:00:00 2001 From: Wojciech Mazur Date: Thu, 4 Jul 2024 12:13:46 +0200 Subject: [PATCH] Revert "Backport "Approximate MatchTypes with lub of case bodies, if non-recursive" to LTS" --- .../src/dotty/tools/dotc/typer/Typer.scala | 10 +------ tests/pos/13633.scala | 2 +- tests/pos/Tuple.Drop.scala | 7 ----- tests/pos/Tuple.Elem.scala | 7 ----- tests/pos/i19710.scala | 11 ------- tests/run-macros/type-show/Test_2.scala | 30 +++++-------------- 6 files changed, 9 insertions(+), 58 deletions(-) delete mode 100644 tests/pos/Tuple.Drop.scala delete mode 100644 tests/pos/Tuple.Elem.scala delete mode 100644 tests/pos/i19710.scala diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index 2ec42604ad08..0c1a5428a4a2 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -2280,15 +2280,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer report.error(MatchTypeScrutineeCannotBeHigherKinded(sel1Tpe), sel1.srcPos) val pt1 = if (bound1.isEmpty) pt else bound1.tpe val cases1 = tree.cases.mapconserve(typedTypeCase(_, sel1Tpe, pt1)) - val bound2 = if tree.bound.isEmpty then - val lub = cases1.foldLeft(defn.NothingType: Type): (acc, case1) => - if !acc.exists then NoType - else if case1.body.tpe.isProvisional then NoType - else acc | case1.body.tpe - if lub.exists then TypeTree(lub, inferred = true) - else bound1 - else bound1 - assignType(cpy.MatchTypeTree(tree)(bound2, sel1, cases1), bound2, sel1, cases1) + assignType(cpy.MatchTypeTree(tree)(bound1, sel1, cases1), bound1, sel1, cases1) } def typedByNameTypeTree(tree: untpd.ByNameTypeTree)(using Context): ByNameTypeTree = tree.result match diff --git a/tests/pos/13633.scala b/tests/pos/13633.scala index 8883ef98d0be..ca0f7e68e81e 100644 --- a/tests/pos/13633.scala +++ b/tests/pos/13633.scala @@ -21,7 +21,7 @@ object Sums extends App: type Reverse[A] = ReverseLoop[A, EmptyTuple] - type PlusTri[A, B, C] <: Tuple = (A, B, C) match + type PlusTri[A, B, C] = (A, B, C) match case (false, false, false) => (false, false) case (true, false, false) | (false, true, false) | (false, false, true) => (false, true) case (true, true, false) | (true, false, true) | (false, true, true) => (true, false) diff --git a/tests/pos/Tuple.Drop.scala b/tests/pos/Tuple.Drop.scala deleted file mode 100644 index 9b88cc227966..000000000000 --- a/tests/pos/Tuple.Drop.scala +++ /dev/null @@ -1,7 +0,0 @@ -import compiletime.ops.int.* - -type Drop[T <: Tuple, N <: Int] <: Tuple = N match - case 0 => T - case S[n1] => T match - case EmptyTuple => EmptyTuple - case x *: xs => Drop[xs, n1] diff --git a/tests/pos/Tuple.Elem.scala b/tests/pos/Tuple.Elem.scala deleted file mode 100644 index 81494485c321..000000000000 --- a/tests/pos/Tuple.Elem.scala +++ /dev/null @@ -1,7 +0,0 @@ -import compiletime.ops.int.* - -type Elem[T <: Tuple, I <: Int] = T match - case h *: tail => - I match - case 0 => h - case S[j] => Elem[tail, j] diff --git a/tests/pos/i19710.scala b/tests/pos/i19710.scala deleted file mode 100644 index 03fd1e2d80b3..000000000000 --- a/tests/pos/i19710.scala +++ /dev/null @@ -1,11 +0,0 @@ -import scala.util.NotGiven - -type HasName1 = [n] =>> [x] =>> x match { - case n => true - case _ => false - } -@main def Test = { - summon[HasName1["foo"]["foo"] =:= true] - summon[NotGiven[HasName1["foo"]["bar"] =:= true]] - summon[Tuple.Filter[(1, "foo", 2, "bar"), HasName1["foo"]] =:= Tuple1["foo"]] // error -} diff --git a/tests/run-macros/type-show/Test_2.scala b/tests/run-macros/type-show/Test_2.scala index ce0f71729efb..d741a426cd69 100644 --- a/tests/run-macros/type-show/Test_2.scala +++ b/tests/run-macros/type-show/Test_2.scala @@ -1,34 +1,18 @@ object Test { import TypeToolbox.* - - def assertEql[A](obt: A, exp: A): Unit = - assert(obt == exp, s"\nexpected: $exp\nobtained: $obt") - def main(args: Array[String]): Unit = { val x = 5 - assertEql(show[x.type], "x.type") - assertEql(show[Nil.type], "scala.Nil.type") - assertEql(show[Int], "scala.Int") - assertEql(show[Int => Int], "scala.Function1[scala.Int, scala.Int]") - assertEql(show[(Int, String)], "scala.Tuple2[scala.Int, scala.Predef.String]") - assertEql(show[[X] =>> X match { case Int => Int }], + assert(show[x.type] == "x.type") + assert(show[Nil.type] == "scala.Nil.type") + assert(show[Int] == "scala.Int") + assert(show[Int => Int] == "scala.Function1[scala.Int, scala.Int]") + assert(show[(Int, String)] == "scala.Tuple2[scala.Int, scala.Predef.String]") + assert(show[[X] =>> X match { case Int => Int }] == """[X >: scala.Nothing <: scala.Any] => X match { | case scala.Int => scala.Int |}""".stripMargin) - assertEql(showStructure[[X] =>> X match { case Int => Int }], - """TypeLambda("""+ - """List(X), """+ - """List(TypeBounds("""+ - """TypeRef(ThisType(TypeRef(NoPrefix(), "scala")), "Nothing"), """+ - """TypeRef(ThisType(TypeRef(NoPrefix(), "scala")), "Any"))), """+ - """MatchType("""+ - """TypeRef(TermRef(ThisType(TypeRef(NoPrefix(), "")), "scala"), "Int"), """+ // match type bound - """ParamRef(binder, 0), """+ - """List("""+ - """MatchCase("""+ - """TypeRef(TermRef(ThisType(TypeRef(NoPrefix(), "")), "scala"), "Int"), """+ - """TypeRef(TermRef(ThisType(TypeRef(NoPrefix(), "")), "scala"), "Int")))))""") + assert(showStructure[[X] =>> X match { case Int => Int }] == """TypeLambda(List(X), List(TypeBounds(TypeRef(ThisType(TypeRef(NoPrefix(), "scala")), "Nothing"), TypeRef(ThisType(TypeRef(NoPrefix(), "scala")), "Any"))), MatchType(TypeRef(ThisType(TypeRef(NoPrefix(), "scala")), "Any"), ParamRef(binder, 0), List(MatchCase(TypeRef(TermRef(ThisType(TypeRef(NoPrefix(), "")), "scala"), "Int"), TypeRef(TermRef(ThisType(TypeRef(NoPrefix(), "")), "scala"), "Int")))))""") // TODO: more complex types: // - implicit function types