@@ -584,9 +584,14 @@ object Erasure {
584584 case _ => // OK
585585 }
586586 }
587- tree
587+ checkNotErasedClass( tree)
588588 }
589589
590+ private def checkNotErasedClass (tree : Tree )(using Context ): tree.type =
591+ if tree.tpe.widen.isErasedClass then
592+ report.error(em " illegal reference to erased ${tree.tpe.widen.typeSymbol} in expression that is not itself erased " , tree.srcPos)
593+ tree
594+
590595 def erasedDef (sym : Symbol )(using Context ): Thicket = {
591596 if (sym.owner.isClass) sym.dropAfter(erasurePhase)
592597 tpd.EmptyTree
@@ -609,7 +614,7 @@ object Erasure {
609614 * are handled separately by [[typedDefDef ]], [[typedValDef ]] and [[typedTyped ]].
610615 */
611616 override def typedTypeTree (tree : untpd.TypeTree , pt : Type )(using Context ): TypeTree =
612- tree.withType(erasure(tree.tpe))
617+ checkNotErasedClass( tree.withType(erasure(tree.tpe) ))
613618
614619 /** This override is only needed to semi-erase type ascriptions */
615620 override def typedTyped (tree : untpd.Typed , pt : Type )(using Context ): Tree =
@@ -628,7 +633,7 @@ object Erasure {
628633 if (tree.typeOpt.isRef(defn.UnitClass ))
629634 tree.withType(tree.typeOpt)
630635 else if (tree.const.tag == Constants .ClazzTag )
631- clsOf(tree.const.typeValue)
636+ checkNotErasedClass( clsOf(tree.const.typeValue) )
632637 else
633638 super .typedLiteral(tree)
634639
@@ -996,6 +1001,9 @@ object Erasure {
9961001 adaptClosure(implClosure)
9971002 }
9981003
1004+ override def typedNew (tree : untpd.New , pt : Type )(using Context ): Tree =
1005+ checkNotErasedClass(super .typedNew(tree, pt))
1006+
9991007 override def typedTypeDef (tdef : untpd.TypeDef , sym : Symbol )(using Context ): Tree =
10001008 EmptyTree
10011009
0 commit comments