Skip to content

Commit d02c7c2

Browse files
authored
Merge pull request #15105 from dotty-staging/fix-15097
Simplify lubs in TreeUnpickler
2 parents f0dd0eb + 60d36ab commit d02c7c2

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

+18-11
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class TreeUnpickler(reader: TastyReader,
113113
class Completer(reader: TastyReader)(using @constructorOnly _ctx: Context) extends LazyType {
114114
import reader._
115115
val owner = ctx.owner
116+
val mode = ctx.mode
116117
val source = ctx.source
117118
def complete(denot: SymDenotation)(using Context): Unit =
118119
def fail(ex: Throwable) =
@@ -129,7 +130,7 @@ class TreeUnpickler(reader: TastyReader,
129130
try
130131
atPhaseBeforeTransforms {
131132
new TreeReader(reader).readIndexedDef()(
132-
using ctx.withOwner(owner).withSource(source))
133+
using ctx.withOwner(owner).withModeBits(mode).withSource(source))
133134
}
134135
catch
135136
case ex: AssertionError => fail(ex)
@@ -1193,6 +1194,10 @@ class TreeUnpickler(reader: TastyReader,
11931194
res.withAttachment(SuppressedApplyToNone, ())
11941195
else res
11951196

1197+
def simplifyLub(tree: Tree): Tree =
1198+
tree.overwriteType(tree.tpe.simplified)
1199+
tree
1200+
11961201
def readLengthTerm(): Tree = {
11971202
val end = readEnd()
11981203
val result =
@@ -1242,23 +1247,25 @@ class TreeUnpickler(reader: TastyReader,
12421247
val tpt = ifBefore(end)(readTpt(), EmptyTree)
12431248
Closure(Nil, meth, tpt)
12441249
case MATCH =>
1245-
if (nextByte == IMPLICIT) {
1246-
readByte()
1247-
InlineMatch(EmptyTree, readCases(end))
1248-
}
1249-
else if (nextByte == INLINE) {
1250-
readByte()
1251-
InlineMatch(readTerm(), readCases(end))
1252-
}
1253-
else Match(readTerm(), readCases(end))
1250+
simplifyLub(
1251+
if (nextByte == IMPLICIT) {
1252+
readByte()
1253+
InlineMatch(EmptyTree, readCases(end))
1254+
}
1255+
else if (nextByte == INLINE) {
1256+
readByte()
1257+
InlineMatch(readTerm(), readCases(end))
1258+
}
1259+
else Match(readTerm(), readCases(end)))
12541260
case RETURN =>
12551261
val from = readSymRef()
12561262
val expr = ifBefore(end)(readTerm(), EmptyTree)
12571263
Return(expr, Ident(from.termRef))
12581264
case WHILE =>
12591265
WhileDo(readTerm(), readTerm())
12601266
case TRY =>
1261-
Try(readTerm(), readCases(end), ifBefore(end)(readTerm(), EmptyTree))
1267+
simplifyLub(
1268+
Try(readTerm(), readCases(end), ifBefore(end)(readTerm(), EmptyTree)))
12621269
case SELECTouter =>
12631270
val levels = readNat()
12641271
readTerm().outerSelect(levels, SkolemType(readType()))

tests/pos/i15097.scala

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class C:
2+
def g: String | Null = ???
3+
4+
def f =
5+
import scala.language.unsafeNulls
6+
try g catch case _ => ""
7+
8+
def f2 =
9+
import scala.language.unsafeNulls
10+
if ??? then g else ""
11+
12+
def f3 =
13+
(??? : Boolean) match
14+
case true => g
15+
case _ => ""
16+
17+
class C2:
18+
import scala.language.unsafeNulls
19+
def g: String | Null = ???
20+
21+
def f =
22+
try g catch case _ => ""
23+
24+
def f2 =
25+
if ??? then g else ""
26+
27+
def f3 =
28+
(??? : Boolean) match
29+
case true => g
30+
case _ => ""

0 commit comments

Comments
 (0)