From a6975146da911501f9db88fede08912e5d48b783 Mon Sep 17 00:00:00 2001 From: Liu Fengyun Date: Tue, 28 Jan 2020 16:01:30 +0100 Subject: [PATCH 1/2] Fix init error in test Note: due to const-fold, the code does not misbehave at runtime. However, it's still good to report errors here, as in this case const-fold changes the semantics of programs, which is too subtle for end users. The field `elemSeparator` and `caseSeparator` are used before they are initialized. -- Error: tests/run/typeclass-derivation2a.scala:31:22 ------------------------- 31 | private final val elemSeparator = '\000' | ^ |Access non-initialized field value elemSeparator. Calling trace: | -> initLabels(0, 0, new mutable.ArrayBuffer[String], new mutable.ArrayBuffer[Array[String]]) [ typeclass-derivation2a.scala:29 ] | -> else if (labelsStr(cur) == elemSeparator) [ typeclass-derivation2a.scala:43 ] -- Error: tests/run/typeclass-derivation2a.scala:32:22 ------------------------- 32 | private final val caseSeparator = '\001' | ^ |Access non-initialized field value caseSeparator. Calling trace: | -> initLabels(0, 0, new mutable.ArrayBuffer[String], new mutable.ArrayBuffer[Array[String]]) [ typeclass-derivation2a.scala:29 ] | -> else if (labelsStr(cur) == caseSeparator) [ typeclass-derivation2a.scala:41 ] 2 errors found --- tests/run/typeclass-derivation2a.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/run/typeclass-derivation2a.scala b/tests/run/typeclass-derivation2a.scala index 912f8342dfb6..67431689c2a8 100644 --- a/tests/run/typeclass-derivation2a.scala +++ b/tests/run/typeclass-derivation2a.scala @@ -25,12 +25,12 @@ object TypeLevel { def mirror(ordinal: Int): Mirror = mirror(ordinal, EmptyProduct) - val label: Array[Array[String]] = - initLabels(0, 0, new mutable.ArrayBuffer[String], new mutable.ArrayBuffer[Array[String]]) - private final val elemSeparator = '\000' private final val caseSeparator = '\001' + val label: Array[Array[String]] = + initLabels(0, 0, new mutable.ArrayBuffer[String], new mutable.ArrayBuffer[Array[String]]) + private def initLabels(start: Int, cur: Int, elems: mutable.ArrayBuffer[String], cases: mutable.ArrayBuffer[Array[String]]): Array[Array[String]] = { From 1522edd85b7d1955040a8ea72a83caddd01f90c1 Mon Sep 17 00:00:00 2001 From: Liu Fengyun Date: Tue, 28 Jan 2020 16:15:07 +0100 Subject: [PATCH 2/2] Fix init: access non-init in run test ```Scala -- Error: tests/run/tuples1.scala:28:27 ---------------------------------------- 28 | val c0_1 = x0 ++ x1; val c0_1c: Int *: Unit = c0_1c; println(s"c0_1 = $c0_1") | ^ |Access non-initialized field value c0_1c. Calling trace: | -> val c0_1 = x0 ++ x1; val c0_1c: Int *: Unit = c0_1c; println(s"c0_1 = $c0_1") [ tuples1.scala:28 ] -- Error: tests/run/tuples1.scala:29:27 ---------------------------------------- 29 | val c1_0 = x1 ++ x0; val c1_0c: Int *: Unit = c1_0c; println(s"c1_0 = $c1_0") | ^ |Access non-initialized field value c1_0c. Calling trace: | -> val c1_0 = x1 ++ x0; val c1_0c: Int *: Unit = c1_0c; println(s"c1_0 = $c1_0") [ tuples1.scala:29 ] ``` --- tests/run/tuples1.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/run/tuples1.scala b/tests/run/tuples1.scala index e3978e51ac15..df6fe0377a85 100644 --- a/tests/run/tuples1.scala +++ b/tests/run/tuples1.scala @@ -25,8 +25,8 @@ object Test extends App { val a6_4 = x6(4); val a6_4c: String = a6_4; println(s"a6_4 = $a6_4") val a8_0 = x8(0); val a8_0c: String = a8_0; println(s"a8_0 = $a8_0") val c0_0 = x0 ++ x0; val c0_0c: Unit = c0_0; println(s"c0_0 = $c0_0") - val c0_1 = x0 ++ x1; val c0_1c: Int *: Unit = c0_1c; println(s"c0_1 = $c0_1") - val c1_0 = x1 ++ x0; val c1_0c: Int *: Unit = c1_0c; println(s"c1_0 = $c1_0") + val c0_1 = x0 ++ x1; val c0_1c: Int *: Unit = c0_1; println(s"c0_1 = $c0_1") + val c1_0 = x1 ++ x0; val c1_0c: Int *: Unit = c1_0; println(s"c1_0 = $c1_0") val c0_4 = x0 ++ x4; val c0_4c: (String, Int, String, Int) = c0_4; println(s"c0_4 = $c0_4") val c4_0 = x4 ++ x0; val c4_0c: (String, Int, String, Int) = c4_0; println(s"c4_0 = $c4_0") val c1_1 = x1 ++ x1; val c1_1c: (Int, Int) = c1_1; println(s"c1_1 = $c1_1")