diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index 0bb4ebd9f772..8696da79c8f3 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -113,6 +113,7 @@ class TreeUnpickler(reader: TastyReader, class Completer(reader: TastyReader)(using @constructorOnly _ctx: Context) extends LazyType { import reader._ val owner = ctx.owner + val mode = ctx.mode val source = ctx.source def complete(denot: SymDenotation)(using Context): Unit = def fail(ex: Throwable) = @@ -129,7 +130,7 @@ class TreeUnpickler(reader: TastyReader, try atPhaseBeforeTransforms { new TreeReader(reader).readIndexedDef()( - using ctx.withOwner(owner).withSource(source)) + using ctx.withOwner(owner).withModeBits(mode).withSource(source)) } catch case ex: AssertionError => fail(ex) @@ -1193,6 +1194,10 @@ class TreeUnpickler(reader: TastyReader, res.withAttachment(SuppressedApplyToNone, ()) else res + def simplifyLub(tree: Tree): Tree = + tree.overwriteType(tree.tpe.simplified) + tree + def readLengthTerm(): Tree = { val end = readEnd() val result = @@ -1242,15 +1247,16 @@ class TreeUnpickler(reader: TastyReader, val tpt = ifBefore(end)(readTpt(), EmptyTree) Closure(Nil, meth, tpt) case MATCH => - if (nextByte == IMPLICIT) { - readByte() - InlineMatch(EmptyTree, readCases(end)) - } - else if (nextByte == INLINE) { - readByte() - InlineMatch(readTerm(), readCases(end)) - } - else Match(readTerm(), readCases(end)) + simplifyLub( + if (nextByte == IMPLICIT) { + readByte() + InlineMatch(EmptyTree, readCases(end)) + } + else if (nextByte == INLINE) { + readByte() + InlineMatch(readTerm(), readCases(end)) + } + else Match(readTerm(), readCases(end))) case RETURN => val from = readSymRef() val expr = ifBefore(end)(readTerm(), EmptyTree) @@ -1258,7 +1264,8 @@ class TreeUnpickler(reader: TastyReader, case WHILE => WhileDo(readTerm(), readTerm()) case TRY => - Try(readTerm(), readCases(end), ifBefore(end)(readTerm(), EmptyTree)) + simplifyLub( + Try(readTerm(), readCases(end), ifBefore(end)(readTerm(), EmptyTree))) case SELECTouter => val levels = readNat() readTerm().outerSelect(levels, SkolemType(readType())) diff --git a/tests/pos/i15097.scala b/tests/pos/i15097.scala new file mode 100644 index 000000000000..8b9cb2b5d893 --- /dev/null +++ b/tests/pos/i15097.scala @@ -0,0 +1,30 @@ +class C: + def g: String | Null = ??? + + def f = + import scala.language.unsafeNulls + try g catch case _ => "" + + def f2 = + import scala.language.unsafeNulls + if ??? then g else "" + + def f3 = + (??? : Boolean) match + case true => g + case _ => "" + +class C2: + import scala.language.unsafeNulls + def g: String | Null = ??? + + def f = + try g catch case _ => "" + + def f2 = + if ??? then g else "" + + def f3 = + (??? : Boolean) match + case true => g + case _ => ""