diff --git a/library/src/scala/NamedTuple.scala b/library/src/scala/NamedTuple.scala index 1e4d3c084a3c..c63ad29c56e9 100644 --- a/library/src/scala/NamedTuple.scala +++ b/library/src/scala/NamedTuple.scala @@ -128,6 +128,10 @@ object NamedTuple: /** The empty named tuple */ val Empty: Empty = EmptyTuple + /** The ordering instance for named tuples */ + given namedTupleOrdering: [N <: Tuple, V <: Tuple] => (ord: Ordering[V]) => Ordering[NamedTuple[N, V]]: + def compare(x: NamedTuple[N, V], y: NamedTuple[N, V]): Int = + ord.compare(x.toTuple, y.toTuple) end NamedTuple /** Separate from NamedTuple object so that we can match on the opaque type NamedTuple. */ diff --git a/project/MiMaFilters.scala b/project/MiMaFilters.scala index 71bb187f4b12..0d93e5ea2942 100644 --- a/project/MiMaFilters.scala +++ b/project/MiMaFilters.scala @@ -8,25 +8,26 @@ object MiMaFilters { val ForwardsBreakingChanges: Map[String, Seq[ProblemFilter]] = Map( // Additions that require a new minor version of the library Build.mimaPreviousDottyVersion -> Seq( - ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.readOnlyCapability"), - ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.onlyCapability"), - // Scala.js-only class ProblemFilters.exclude[FinalClassProblem]("scala.scalajs.runtime.AnonFunctionXXL"), ProblemFilters.exclude[DirectMissingMethodProblem]("scala.scalajs.runtime.AnonFunctionXXL.this"), ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language.2.13"), ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$2$u002E13$"), - ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language#experimental.separationChecking"), - ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$experimental$separationChecking$"), ProblemFilters.exclude[DirectMissingMethodProblem]("scala.Conversion.underlying"), ProblemFilters.exclude[MissingClassProblem]("scala.Conversion$"), - ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.RuntimeChecked"), - + ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.RuntimeChecked"), ProblemFilters.exclude[MissingClassProblem]("scala.annotation.stableNull"), - ProblemFilters.exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#ValDefModule.let"), + ProblemFilters.exclude[DirectMissingMethodProblem]("scala.NamedTuple.namedTupleOrdering"), + ProblemFilters.exclude[MissingClassProblem]("scala.NamedTuple$namedTupleOrdering"), + + // cc related + ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.readOnlyCapability"), + ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.onlyCapability"), + ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language#experimental.separationChecking"), + ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$experimental$separationChecking$"), ), // Additions since last LTS diff --git a/tests/run/named-tuple-ordering.check b/tests/run/named-tuple-ordering.check new file mode 100644 index 000000000000..ea1c136aeec1 --- /dev/null +++ b/tests/run/named-tuple-ordering.check @@ -0,0 +1 @@ +List((Alice,29), (Alice,30), (Bob,25), (Charlie,35)) diff --git a/tests/run/named-tuple-ordering.scala b/tests/run/named-tuple-ordering.scala new file mode 100644 index 000000000000..5d1c4583c915 --- /dev/null +++ b/tests/run/named-tuple-ordering.scala @@ -0,0 +1,13 @@ +type Person = (name: String, age: Int) + +val so = summon[Ordering[Person]] + +val people: List[Person] = List( + (name = "Charlie", age = 35), + (name = "Alice", age = 30), + (name = "Alice", age = 29), + (name = "Bob", age = 25), +) +val sortedPeople = people.sorted + +@main def Test = println(s"$sortedPeople")