Skip to content

Commit b9cbc1f

Browse files
committed
remove JavaEnumValue from AfterLoadFlags
1 parent 334a430 commit b9cbc1f

File tree

8 files changed

+42
-10
lines changed

8 files changed

+42
-10
lines changed

compiler/src/dotty/tools/dotc/core/Flags.scala

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -450,12 +450,7 @@ object Flags {
450450
* is completed)
451451
*/
452452
val AfterLoadFlags: FlagSet = commonFlags(
453-
FromStartFlags, AccessFlags, Final, AccessorOrSealed, LazyOrTrait, SelfName, JavaDefined,
454-
// We would like to add JavaEnumValue to this set so that we can correctly
455-
// detect it in JavaNullInterop. However, JavaEnumValue is not initialized at this
456-
// point, so we just make sure that all the "primitive" flags contained in JavaEnumValue
457-
// are mentioned here as well.
458-
Enum, StableRealizable)
453+
FromStartFlags, AccessFlags, Final, AccessorOrSealed, LazyOrTrait, SelfName, JavaDefined)
459454

460455
/** A value that's unstable unless complemented with a Stable flag */
461456
val UnstableValueFlags: FlagSet = Mutable | Method

compiler/src/dotty/tools/dotc/core/JavaNullInterop.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ object JavaNullInterop {
5252
*
5353
* But the selection can throw an NPE if the returned value is `null`.
5454
*/
55-
def nullifyMember(sym: Symbol, tp: Type)(implicit ctx: Context): Type = {
55+
def nullifyMember(sym: Symbol, tp: Type, isEnum: Boolean)(implicit ctx: Context): Type = {
5656
assert(ctx.explicitNulls)
5757
assert(sym.is(JavaDefined), "can only nullify java-defined members")
5858

5959
// Some special cases when nullifying the type
60-
if (sym.name == nme.TYPE_ || sym.isAllOf(Flags.JavaEnumValue))
60+
if (isEnum || sym.name == nme.TYPE_)
6161
// Don't nullify the `TYPE` field in every class and Java enum instances
6262
tp
6363
else if (sym.name == nme.toString_ || sym.isConstructor || hasNotNullAnnot(sym))

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ class ClassfileParser(
287287
if (denot.is(Flags.Method) && (jflags & JAVA_ACC_VARARGS) != 0)
288288
denot.info = arrayToRepeated(denot.info)
289289

290-
if (ctx.explicitNulls) denot.info = JavaNullInterop.nullifyMember(denot.symbol, denot.info)
290+
if (ctx.explicitNulls) denot.info = JavaNullInterop.nullifyMember(denot.symbol, denot.info, isEnum)
291291

292292
// seal java enums
293293
if (isEnum) {

compiler/src/dotty/tools/dotc/typer/Namer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1421,7 +1421,7 @@ class Namer { typer: Typer =>
14211421
}
14221422
val memTpe = paramFn(checkSimpleKinded(typedAheadType(mdef.tpt, tptProto)).tpe)
14231423
if (ctx.explicitNulls && mdef.mods.is(JavaDefined))
1424-
JavaNullInterop.nullifyMember(sym, memTpe)
1424+
JavaNullInterop.nullifyMember(sym, memTpe, mdef.mods.isAllOf(JavaEnumValue))
14251425
else memTpe
14261426
}
14271427

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
public enum Day_1 {
3+
SUN,
4+
MON,
5+
TUE
6+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
public enum Planet_2 {
2+
MERCURY (3.303e+23, 2.4397e6),
3+
VENUS (4.869e+24, 6.0518e6),
4+
EARTH (5.976e+24, 6.37814e6),
5+
MARS (6.421e+23, 3.3972e6),
6+
JUPITER (1.9e+27, 7.1492e7),
7+
SATURN (5.688e+26, 6.0268e7),
8+
URANUS (8.686e+25, 2.5559e7),
9+
NEPTUNE (1.024e+26, 2.4746e7);
10+
11+
private final double mass; // in kilograms
12+
private final double radius; // in meters
13+
Planet_2(double mass, double radius) {
14+
this.mass = mass;
15+
this.radius = radius;
16+
}
17+
private double mass() { return mass; }
18+
private double radius() { return radius; }
19+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
// Verify that enum values aren't nullified.
3+
class S {
4+
val d: Day_1 = Day_1.MON
5+
val p: Planet_2 = Planet_2.MARS
6+
}

tests/explicit-nulls/pos/widen-nullable-union.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,10 @@ class Test {
3333
val y = x
3434
val _: AnyRef | Null = y
3535
}
36+
37+
locally {
38+
val x: (A | Null) & (Null | B) = ???
39+
val y = x
40+
val _: (A & B) | Null = y
41+
}
3642
}

0 commit comments

Comments
 (0)