@@ -583,6 +583,17 @@ object Erasure {
583583 checkNotErasedClass(tree)
584584 end checkNotErased
585585
586+ def checkPureErased (tree : untpd.Tree , isArgument : Boolean )(using Context ): Unit =
587+ if false then inContext(preErasureCtx):
588+ if tpd.isPureExpr(tree.asInstanceOf [tpd.Tree ]) then
589+ val tree1 = tree.asInstanceOf [tpd.Tree ]
590+ println(i " $tree1 is pure, ${tree1.tpe.widen}" )
591+ else
592+ def what =
593+ if isArgument then " argument to erased parameter"
594+ else " right-hand-side of erased value"
595+ report.error(em " $what fails to be a pure expression " , tree.srcPos)
596+
586597 private def checkNotErasedClass (tp : Type , tree : untpd.Tree )(using Context ): Unit = tp match
587598 case JavaArrayType (et) =>
588599 checkNotErasedClass(et, tree)
@@ -848,7 +859,12 @@ object Erasure {
848859 val origFunType = origFun.tpe.widen(using preErasureCtx)
849860 val ownArgs = origFunType match
850861 case mt : MethodType if mt.hasErasedParams =>
851- args.zip(mt.erasedParams).collect { case (arg, false ) => arg }
862+ args.lazyZip(mt.paramErasureStatuses).flatMap: (arg, isErased) =>
863+ if isErased then
864+ checkPureErased(arg, isArgument = true )
865+ Nil
866+ else
867+ arg :: Nil
852868 case _ => args
853869 val fun1 = typedExpr(fun, AnyFunctionProto )
854870 fun1.tpe.widen match
@@ -916,7 +932,9 @@ object Erasure {
916932 }
917933
918934 override def typedValDef (vdef : untpd.ValDef , sym : Symbol )(using Context ): Tree =
919- if (sym.isEffectivelyErased) erasedDef(sym)
935+ if sym.isEffectivelyErased then
936+ checkPureErased(vdef.rhs, isArgument = false )
937+ erasedDef(sym)
920938 else
921939 checkNotErasedClass(sym.info, vdef)
922940 super .typedValDef(untpd.cpy.ValDef (vdef)(
@@ -928,6 +946,7 @@ object Erasure {
928946 */
929947 override def typedDefDef (ddef : untpd.DefDef , sym : Symbol )(using Context ): Tree =
930948 if sym.isEffectivelyErased || sym.name.is(BodyRetainerName ) then
949+ checkPureErased(ddef.rhs, isArgument = false )
931950 erasedDef(sym)
932951 else
933952 checkNotErasedClass(sym.info.finalResultType, ddef)
0 commit comments