Skip to content

Commit 0820aca

Browse files
committed
Handle O.this outside of it's definition
1 parent 02c6f81 commit 0820aca

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

compiler/src/dotty/tools/dotc/transform/init/Semantic.scala

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -868,8 +868,11 @@ class Semantic {
868868
cases(tmref.prefix, thisV, klass, source).select(tmref.symbol, source)
869869

870870
case tp @ ThisType(tref) =>
871-
val value = resolveThis(tref.classSymbol.asClass, thisV, klass, source)
872-
Result(value, Errors.empty)
871+
val cls = tref.classSymbol.asClass
872+
if cls.isStaticOwner && !klass.isContainedIn(cls) then Result(Hot, Nil)
873+
else
874+
val value = resolveThis(cls, thisV, klass, source)
875+
Result(value, Errors.empty)
873876

874877
case _: TermParamRef | _: RecThis =>
875878
// possible from checking effects of types
@@ -890,7 +893,12 @@ class Semantic {
890893
case addr: Addr =>
891894
val obj = heap(addr)
892895
val outerCls = klass.owner.enclosingClass.asClass
893-
resolveThis(target, obj.outers(klass), outerCls, source)
896+
if !obj.outers.contains(klass) then
897+
val error = PromoteError("outer not yet initialized, target = " + target + ", klass = " + klass, source, trace.toVector)
898+
report.error(error.show + error.stacktrace, source)
899+
Hot
900+
else
901+
resolveThis(target, obj.outers(klass), outerCls, source)
894902
case RefSet(refs) =>
895903
refs.map(ref => resolveThis(target, ref, klass, source)).join
896904
case fun: Fun =>

project/Build.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,7 @@ object Build {
733733
"-Ddotty.tests.classes.dottyTastyInspector=" + jars("scala3-tasty-inspector"),
734734
)
735735
},
736+
scalacOptions += "-Ysafe-init",
736737
packageAll := {
737738
(`scala3-compiler` / packageAll).value ++ Seq(
738739
"scala3-compiler" -> (Compile / packageBin).value.getAbsolutePath,

tests/init/pos/Parsers.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
object Parsers {
2+
enum Location(val inParens: Boolean, val inPattern: Boolean, val inArgs: Boolean):
3+
case InParens extends Location(true, false, false)
4+
case InArgs extends Location(true, false, true)
5+
case InPattern extends Location(false, true, false)
6+
case InGuard extends Location(false, false, false)
7+
case InPatternArgs extends Location(false, true, true) // InParens not true, since it might be an alternative
8+
case InBlock extends Location(false, false, false)
9+
case ElseWhere extends Location(false, false, false)
10+
}

0 commit comments

Comments
 (0)