From 4cfb637932e6f9e02adacf24d058b4574d654d12 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Tue, 25 May 2021 16:00:51 +0200 Subject: [PATCH] IArray.toArray: Deprecate broken method The cast in the original method is unsound. Any attempt at fixing this would break source-compatibility, so this commit only deprecates it, to be revisited for 3.1. --- library/src/scala/IArray.scala | 8 +++++--- tests/neg-custom-args/deprecation/i12597.scala | 5 +++++ tests/run/i12597.scala | 5 +++++ 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 tests/neg-custom-args/deprecation/i12597.scala create mode 100644 tests/run/i12597.scala diff --git a/library/src/scala/IArray.scala b/library/src/scala/IArray.scala index 50d40b6f2f19..c5679ae7aaf9 100644 --- a/library/src/scala/IArray.scala +++ b/library/src/scala/IArray.scala @@ -249,9 +249,11 @@ object IArray: extension [T](arr: IArray[T]) def takeWhile(p: T => Boolean): IArray[T] = genericArrayOps(arr).takeWhile(p) - /** Returns a mutable copy of this immutable array. */ - extension [T](arr: IArray[T]) def toArray: Array[T] = - arr.clone.asInstanceOf[Array[T]] + extension [T](arr: IArray[T]) + /** Returns a mutable copy of this immutable array. */ + @deprecated("This method implementation is incorrect and calling it can crash your program, please use `IArray.genericWrapArray(myIArray).toArray` instead.", "3.0.1") + def toArray: Array[T] = + arr.clone.asInstanceOf[Array[T]] extension [T](arr: IArray[T]) def ++[U >: T: ClassTag](suffix: IArray[U]): IArray[U] = genericArrayOps(arr) ++ suffix.toSeq diff --git a/tests/neg-custom-args/deprecation/i12597.scala b/tests/neg-custom-args/deprecation/i12597.scala new file mode 100644 index 000000000000..7927dded0cbc --- /dev/null +++ b/tests/neg-custom-args/deprecation/i12597.scala @@ -0,0 +1,5 @@ +@main def Test = + val a: IArray[Int] = IArray(2) + val b: IArray[Any] = a + val c = b.toArray // error: deprecated + c(0) = "" diff --git a/tests/run/i12597.scala b/tests/run/i12597.scala new file mode 100644 index 000000000000..73cc4185d74e --- /dev/null +++ b/tests/run/i12597.scala @@ -0,0 +1,5 @@ +@main def Test = + val a: IArray[Int] = IArray(2) + val b: IArray[Any] = a + val c = IArray.genericWrapArray(b).toArray + c(0) = ""