@@ -104,12 +104,12 @@ object DesugarEnums {
104
104
105
105
/** The following lists of definitions for an enum type E and known value cases e_0, ..., e_n:
106
106
*
107
- * private val $values = Array[E](e_0,...,e_n)(ClassTag[E](classOf[E])): @unchecked
107
+ * private val $values = Array[E](this. e_0,...,this. e_n)(ClassTag[E](classOf[E])): @unchecked
108
108
* def values = $values.clone
109
109
* def valueOf($name: String) = $name match {
110
- * case "e_0" => e_0
110
+ * case "e_0" => this. e_0
111
111
* ...
112
- * case "e_n" => e_n
112
+ * case "e_n" => this. e_n
113
113
* case _ => throw new IllegalArgumentException("case not found: " + $name)
114
114
* }
115
115
*/
@@ -119,6 +119,12 @@ object DesugarEnums {
119
119
120
120
val privateValuesDef =
121
121
val uncheckedValues =
122
+ // Here we use an unchecked annotation to silence warnings from the init checker. Without it, we get a warning
123
+ // that simple enum cases are promoting this from warm to initialised. This is because we are populating the
124
+ // array by selecting enum values from `this`, a value under construction.
125
+ // Singleton enum values always construct a new anonymous class, which will not be checked by the init-checker,
126
+ // so this warning will always persist even if the implementation of the anonymous class is safe.
127
+ // TODO: remove @unchecked after https://github.com/lampepfl/dotty-feature-requests/issues/135 is resolved.
122
128
Annotated (ArrayLiteral (enumValues, rawEnumClassRef), New (ref(defn.UncheckedAnnot .typeRef)))
123
129
ValDef (nme.DOLLAR_VALUES , TypeTree (), uncheckedValues)
124
130
.withFlags(Private | Synthetic )
0 commit comments