-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Rewrite resolveThis in global init checker #23282
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
798fd49
to
1e0eb9f
Compare
@@ -287,11 +287,19 @@ class Objects(using Context @constructorOnly): | |||
def toScopeSet: ScopeSet = ScopeSet(values.asInstanceOf[Set[Scope]]) | |||
|
|||
case class ScopeSet(scopes: Set[Scope]): | |||
assert(scopes.forall(_.isRef) || scopes.forall(_.isEnv), "All scopes should have the same type!") | |||
def isRefSet = scopes.forall(_.isRef) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we keep an assertion that isRefSet || isEnvSet
?
@@ -1969,6 +1977,11 @@ class Objects(using Context @constructorOnly): | |||
case _ => | |||
report.warning("[Internal error] unexpected thisV = " + thisV + ", target = " + target.show + Trace.show, Trace.position) | |||
Bottom | |||
if resolveResult == Bottom && thisV.filterClass(target) == thisV then |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible that target
could be a parent class of an outer class?
Here's an example of a class A {
var x = 42
def change = (x = 44)
class B {
val i = 5
def fooz = A.this.x // if this is an instance of class C, does A.this resolve to the C outer or to the B outer ???
def fooz2 = A.this.x
class D {
def bar = fooz
def bar2 = fooz2
}
}
}
class AA extends A {
def foo = {
//val y = 43
val a = if(*) new A else new AAA
class C /*outer AA*/ extends a.B /*outer A or AAA*/ {
override val i = 6
override def fooz2 = x
}
val bb: B = if(false) new a.B else new C
val d = new bb.D
d.bar // reads AA.x
d.bar2 // reads AA.x
}
}
d --outer-> {B or C} --outer-> {A or foo} --outer --> {A} |
1e0eb9f
to
8b89ae9
Compare
@olhotak @liufengyun I have added two rather complex tests, feel free to run them with scala-cli.
|
The second test |
It's not clear why The following comment might help: scala3/compiler/src/dotty/tools/dotc/transform/init/Semantic.scala Lines 1207 to 1216 in 0be2091
|
This PR resolves bugs in the redesigned global initialization checker; specifically, it now correctly resolves the value of
parent.this
in a child class, and removes the assertions that fail in community build projects