Skip to content

Commit 3984c67

Browse files
authored
Merge pull request #12095 from dotty-staging/improve-erased-terms-erasure
Improve invariant checks for erased terms
2 parents 6d0817d + e152abe commit 3984c67

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed

compiler/src/dotty/tools/dotc/transform/PostTyper.scala

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,8 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
243243
private object dropInlines extends TreeMap {
244244
override def transform(tree: Tree)(using Context): Tree = tree match {
245245
case Inlined(call, _, expansion) =>
246-
val newExpansion = tree.tpe match
247-
case ConstantType(c) => Literal(c)
248-
case _ => Typed(ref(defn.Predef_undefined), TypeTree(tree.tpe))
249-
cpy.Inlined(tree)(call, Nil, newExpansion.withSpan(tree.span))
246+
val newExpansion = PruneErasedDefs.trivialErasedTree(tree)
247+
cpy.Inlined(tree)(call, Nil, newExpansion)
250248
case _ => super.transform(tree)
251249
}
252250
}
@@ -282,7 +280,8 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
282280
tpd.cpy.Apply(tree)(
283281
tree.fun,
284282
tree.args.mapConserve(arg =>
285-
if (methType.isImplicitMethod && arg.span.isSynthetic) ref(defn.Predef_undefined)
283+
if (methType.isImplicitMethod && arg.span.isSynthetic)
284+
PruneErasedDefs.trivialErasedTree(arg)
286285
else dropInlines.transform(arg)))
287286
else
288287
tree
@@ -414,12 +413,12 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
414413
// case x: (_: Tree[?])
415414
case m @ MatchTypeTree(bounds, selector, cases) =>
416415
// Analog to the case above for match types
417-
def tranformIgnoringBoundsCheck(x: CaseDef): CaseDef =
416+
def transformIgnoringBoundsCheck(x: CaseDef): CaseDef =
418417
withMode(Mode.Pattern)(super.transform(x)).asInstanceOf[CaseDef]
419418
cpy.MatchTypeTree(tree)(
420419
super.transform(bounds),
421420
super.transform(selector),
422-
cases.mapConserve(tranformIgnoringBoundsCheck)
421+
cases.mapConserve(transformIgnoringBoundsCheck)
423422
)
424423
case Block(_, Closure(_, _, tpt)) if ExpandSAMs.needsWrapperClass(tpt.tpe) =>
425424
superAcc.withInvalidCurrentClass(super.transform(tree))

compiler/src/dotty/tools/dotc/transform/PruneErasedDefs.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import ast.tpd
2222
*/
2323
class PruneErasedDefs extends MiniPhase with SymTransformer { thisTransform =>
2424
import tpd._
25+
import PruneErasedDefs._
2526

2627
override def phaseName: String = PruneErasedDefs.name
2728

@@ -39,19 +40,19 @@ class PruneErasedDefs extends MiniPhase with SymTransformer { thisTransform =>
3940

4041
override def transformValDef(tree: ValDef)(using Context): Tree =
4142
if !tree.symbol.isEffectivelyErased || tree.rhs.isEmpty then tree
42-
else cpy.ValDef(tree)(rhs = trivialErasedTree(tree))
43+
else cpy.ValDef(tree)(rhs = trivialErasedTree(tree.rhs))
4344

4445
override def transformDefDef(tree: DefDef)(using Context): Tree =
4546
if !tree.symbol.isEffectivelyErased || tree.rhs.isEmpty then tree
46-
else cpy.DefDef(tree)(rhs = trivialErasedTree(tree))
47-
48-
private def trivialErasedTree(tree: Tree)(using Context): Tree =
49-
tree.tpe.widenTermRefExpr.dealias.normalized match
50-
case ConstantType(c) => Literal(c)
51-
case _ => ref(defn.Predef_undefined)
47+
else cpy.DefDef(tree)(rhs = trivialErasedTree(tree.rhs))
5248

5349
}
5450

5551
object PruneErasedDefs {
52+
import tpd._
53+
5654
val name: String = "pruneErasedDefs"
55+
56+
def trivialErasedTree(tree: Tree)(using Context): Tree =
57+
ref(defn.Compiletime_erasedValue).appliedToType(tree.tpe).withSpan(tree.span)
5758
}

0 commit comments

Comments
 (0)