@@ -583,6 +583,17 @@ object Erasure {
583
583
checkNotErasedClass(tree)
584
584
end checkNotErased
585
585
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
+
586
597
private def checkNotErasedClass (tp : Type , tree : untpd.Tree )(using Context ): Unit = tp match
587
598
case JavaArrayType (et) =>
588
599
checkNotErasedClass(et, tree)
@@ -848,7 +859,12 @@ object Erasure {
848
859
val origFunType = origFun.tpe.widen(using preErasureCtx)
849
860
val ownArgs = origFunType match
850
861
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
852
868
case _ => args
853
869
val fun1 = typedExpr(fun, AnyFunctionProto )
854
870
fun1.tpe.widen match
@@ -916,7 +932,9 @@ object Erasure {
916
932
}
917
933
918
934
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)
920
938
else
921
939
checkNotErasedClass(sym.info, vdef)
922
940
super .typedValDef(untpd.cpy.ValDef (vdef)(
@@ -928,6 +946,7 @@ object Erasure {
928
946
*/
929
947
override def typedDefDef (ddef : untpd.DefDef , sym : Symbol )(using Context ): Tree =
930
948
if sym.isEffectivelyErased || sym.name.is(BodyRetainerName ) then
949
+ checkPureErased(ddef.rhs, isArgument = false )
931
950
erasedDef(sym)
932
951
else
933
952
checkNotErasedClass(sym.info.finalResultType, ddef)
0 commit comments