@@ -479,10 +479,16 @@ object Semantic:
479
479
RefSet (refs1 ++ diff)
480
480
481
481
/** Conservatively approximate the value with `Cold` or `Hot` */
482
- def widenArg : Value =
482
+ def widenArg : Contextual [ Value ] =
483
483
a match
484
- case _ : Ref | _ : Fun => Cold
485
- case RefSet (refs) => refs.map(_.widenArg).join
484
+ case _ : Ref | _ : Fun =>
485
+ val errors = Reporter .stopEarly { a.promote(" Argument cannot be promoted to hot" ) }
486
+ if errors.isEmpty then Hot
487
+ else Cold
488
+
489
+ case RefSet (refs) =>
490
+ refs.map(_.widenArg).join
491
+
486
492
case _ => a
487
493
488
494
@@ -491,7 +497,7 @@ object Semantic:
491
497
if values.isEmpty then Hot
492
498
else values.reduce { (v1, v2) => v1.join(v2) }
493
499
494
- def widenArgs : List [Value ] = values.map(_.widenArg).toList
500
+ def widenArgs : Contextual [ List [Value ] ] = values.map(_.widenArg).toList
495
501
496
502
497
503
extension (ref : Ref )
@@ -738,12 +744,13 @@ object Semantic:
738
744
if ctor.hasSource then
739
745
val cls = ctor.owner.enclosingClass.asClass
740
746
val ddef = ctor.defTree.asInstanceOf [DefDef ]
741
- given Env = Env (ddef, args.map(_.value).widenArgs)
747
+ val env2 = Env (ddef, args.map(_.value).widenArgs)
742
748
if ctor.isPrimaryConstructor then
749
+ given Env = env2
743
750
val tpl = cls.defTree.asInstanceOf [TypeDef ].rhs.asInstanceOf [Template ]
744
751
extendTrace(cls.defTree) { init(tpl, ref, cls) }
745
752
else
746
- addParamsAsFields(env , ref, ddef)
753
+ addParamsAsFields(env2 , ref, ddef)
747
754
val initCall = ddef.rhs match
748
755
case Block (call :: _, _) => call
749
756
case call => call
@@ -756,13 +763,14 @@ object Semantic:
756
763
if ctor.hasSource then
757
764
val cls = ctor.owner.enclosingClass.asClass
758
765
val ddef = ctor.defTree.asInstanceOf [DefDef ]
759
- given Env = Env (ddef, args.map(_.value).widenArgs)
766
+ val env2 = Env (ddef, args.map(_.value).widenArgs)
760
767
if ctor.isPrimaryConstructor then
768
+ given Env = env2
761
769
val tpl = cls.defTree.asInstanceOf [TypeDef ].rhs.asInstanceOf [Template ]
762
770
extendTrace(cls.defTree) { eval(tpl, ref, cls, cacheResult = true ) }
763
771
ref
764
772
else
765
- addParamsAsFields(env , ref, ddef)
773
+ addParamsAsFields(env2 , ref, ddef)
766
774
extendTrace(ddef) { eval(ddef.rhs, ref, cls, cacheResult = true ) }
767
775
else if ref.canIgnoreMethodCall(ctor) then
768
776
Hot
0 commit comments