@@ -918,20 +918,21 @@ object Semantic {
918918
919919 case warm : Warm =>
920920 if promoted.contains(warm) then Nil
921- else {
921+ else
922922 promoted.add(warm)
923923 val errors = warm.tryPromote(msg, source)
924924 if errors.nonEmpty then promoted.remove(warm)
925925 errors
926- }
927926
928927 case fun @ Fun (body, thisV, klass, env) =>
929928 if promoted.contains(fun) then Nil
930929 else
931930 val res = withEnv(env) { eval(body, thisV, klass) }
932- val errors2 = res.value.promote(msg, source)
933- if (res.errors.nonEmpty || errors2.nonEmpty)
934- UnsafePromotion (msg, source, trace.toVector, res.errors ++ errors2) :: Nil
931+ val errors =
932+ if res.value == Hot then res.errors
933+ else res.errors :+ PromoteError (" The function return value is not fully initialized." , source, trace.toVector)
934+ if (res.errors.nonEmpty || res.value != Hot )
935+ UnsafePromotion (msg, source, trace.toVector, errors) :: Nil
935936 else
936937 promoted.add(fun)
937938 Nil
@@ -966,20 +967,24 @@ object Semantic {
966967
967968 val buffer = new mutable.ArrayBuffer [Error ]
968969
970+ def checkHot (res : Result , msg : String , source : Tree ): Errors =
971+ if res.value == Hot || promoted.contains(res.value) then res.errors
972+ else res.errors :+ PromoteError (msg, source, trace.toVector)
973+
969974 warm.klass.baseClasses.exists { klass =>
970975 klass.hasSource && klass.info.decls.exists { member =>
971976 if ! member.isType && ! member.isConstructor && member.hasSource && ! member.is(Flags .Deferred ) then
972- if member.is(Flags .Method ) then
977+ if member.is(Flags .Method , butNot = Flags . Accessor ) then
973978 val trace2 = trace.add(source)
974979 locally {
975980 given Trace = trace2
976981 val args = member.info.paramInfoss.flatten.map(_ => ArgInfo (Hot , EmptyTree ))
977982 val res = warm.call(member, args, receiver = NoType , superType = NoType , source = member.defTree)
978- buffer ++= res.ensureHot(msg , source).errors
983+ buffer ++= checkHot( res, " Cannot prove that the return value of " + member + " is fully initialized. " , source)
979984 }
980985 else
981986 val res = warm.select(member, source)
982- buffer ++= res.ensureHot(msg , source).errors
987+ buffer ++= checkHot( res, " Cannot prove that the field " + member + " is fully initialized. " , source)
983988 buffer.nonEmpty
984989 }
985990 }
@@ -1076,7 +1081,7 @@ object Semantic {
10761081
10771082 /** Utility definition used for better error-reporting of argument errors */
10781083 case class ArgInfo (value : Value , source : Tree ) {
1079- def promote : Contextual [List [Error ]] = value.promote(" Only initialized values may be used as arguments " , source)
1084+ def promote : Contextual [List [Error ]] = value.promote(" Cannot prove the argument is fully initialized. " , source)
10801085 }
10811086
10821087 /** Evaluate an expression with the given value for `this` in a given class `klass`
@@ -1206,9 +1211,9 @@ object Semantic {
12061211 lhs match
12071212 case Select (qual, _) =>
12081213 val res = eval(qual, thisV, klass)
1209- eval(rhs, thisV, klass).ensureHot(" May only assign fully initialized value" , rhs) ++ res.errors
1214+ eval(rhs, thisV, klass).ensureHot(" May only assign fully initialized value. " , rhs) ++ res.errors
12101215 case id : Ident =>
1211- eval(rhs, thisV, klass).ensureHot(" May only assign fully initialized value" , rhs)
1216+ eval(rhs, thisV, klass).ensureHot(" May only assign fully initialized value. " , rhs)
12121217
12131218 case closureDef(ddef) =>
12141219 val value = Fun (ddef.rhs, thisV, klass, env)
@@ -1233,14 +1238,14 @@ object Semantic {
12331238 else eval(arg, thisV, klass)
12341239
12351240 case Match (selector, cases) =>
1236- val res1 = eval(selector, thisV, klass).ensureHot(" The value to be matched needs to be fully initialized" , selector)
1241+ val res1 = eval(selector, thisV, klass).ensureHot(" The value to be matched needs to be fully initialized. " , selector)
12371242 val ress = eval(cases.map(_.body), thisV, klass)
12381243 val value = ress.map(_.value).join
12391244 val errors = res1.errors ++ ress.flatMap(_.errors)
12401245 Result (value, errors)
12411246
12421247 case Return (expr, from) =>
1243- eval(expr, thisV, klass).ensureHot(" return expression may only be initialized value" , expr)
1248+ eval(expr, thisV, klass).ensureHot(" return expression may only be initialized value. " , expr)
12441249
12451250 case WhileDo (cond, body) =>
12461251 val ress = eval(cond :: body :: Nil , thisV, klass)
0 commit comments