@@ -790,13 +790,11 @@ class Semantic {
790790 Result (value, Nil )
791791
792792 case Block (stats, expr) =>
793- val (ress, env2) = eval(stats, thisV, klass)
794- withEnv(env2) {
795- eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
796- }
793+ val ress = eval(stats, thisV, klass)
794+ eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
797795
798796 case If (cond, thenp, elsep) =>
799- val ( ress, env2) = eval(cond :: thenp :: elsep :: Nil , thisV, klass)
797+ val ress = eval(cond :: thenp :: elsep :: Nil , thisV, klass)
800798 val value = ress.map(_.value).join
801799 val errors = ress.flatMap(_.errors)
802800 Result (value, errors)
@@ -807,7 +805,7 @@ class Semantic {
807805
808806 case Match (selector, cases) =>
809807 val res1 = eval(selector, thisV, klass).ensureHot(" The value to be matched needs to be fully initialized" , selector)
810- val ( ress, env) = eval(cases.map(_.body), thisV, klass)
808+ val ress = eval(cases.map(_.body), thisV, klass)
811809 val value = ress.map(_.value).join
812810 val errors = res1.errors ++ ress.flatMap(_.errors)
813811 Result (value, errors)
@@ -816,15 +814,15 @@ class Semantic {
816814 eval(expr, thisV, klass).ensureHot(" return expression may only be initialized value" , expr)
817815
818816 case WhileDo (cond, body) =>
819- val ( ress, env2) = eval(cond :: body :: Nil , thisV, klass)
817+ val ress = eval(cond :: body :: Nil , thisV, klass)
820818 Result (Hot , ress.flatMap(_.errors))
821819
822820 case Labeled (_, expr) =>
823821 eval(expr, thisV, klass)
824822
825823 case Try (block, cases, finalizer) =>
826824 val res1 = eval(block, thisV, klass)
827- val ( ress, env2) = eval(cases.map(_.body), thisV, klass)
825+ val ress = eval(cases.map(_.body), thisV, klass)
828826 val errors = ress.flatMap(_.errors)
829827 val resValue = ress.map(_.value).join
830828 if finalizer.isEmpty then
@@ -840,7 +838,7 @@ class Semantic {
840838 Result (Hot , ress.flatMap(_.errors))
841839
842840 case Inlined (call, bindings, expansion) =>
843- val ( ress, env2) = eval(bindings, thisV, klass)
841+ val ress = eval(bindings, thisV, klass)
844842 eval(expansion, thisV, klass) ++ ress.flatMap(_.errors)
845843
846844 case Thicket (List ()) =>
@@ -896,10 +894,27 @@ class Semantic {
896894 // It's always safe to approximate them with `Cold`.
897895 Result (Cold , Nil )
898896 else
899- // resolve this for local variable
900- val enclosingClass = sym.owner.enclosingClass.asClass
901- val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
902-
897+ sym.defTree match {
898+ case vdef : ValDef => {
899+ // resolve this for local variable
900+ val enclosingClass = sym.owner.enclosingClass.asClass
901+ val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
902+ thisValue2 match {
903+ case Hot => Result (Hot , Errors .empty)
904+ case Cold => {
905+ val error = AccessCold (sym, source, trace.toVector)
906+ Result (Hot , error :: Nil )
907+ }
908+ case addr : Addr => {
909+ val res = eval(vdef.rhs, addr, klass)
910+ if res.value.promote(" Try promote" , source).isEmpty then Result (Hot , Errors .empty) else res
911+ }
912+ case _ => ???
913+ }
914+ }
915+ case _ => default()
916+ }
917+
903918 case tmref : TermRef =>
904919 cases(tmref.prefix, thisV, klass, source).select(tmref.symbol, source)
905920
@@ -994,7 +1009,7 @@ class Semantic {
9941009 // parents
9951010 def initParent (parent : Tree , tasks : Tasks )(using Env ) = parent match {
9961011 case tree @ Block (stats, NewExpr (tref, New (tpt), ctor, argss)) => // can happen
997- eval(stats, thisV, klass)._1. foreach { res => errorBuffer ++= res.errors }
1012+ eval(stats, thisV, klass).foreach { res => errorBuffer ++= res.errors }
9981013 val (errors, args) = evalArgs(argss.flatten, thisV, klass)
9991014 errorBuffer ++= errors
10001015 superCall(tref, ctor, args, tree, tasks)
0 commit comments