Skip to content

Commit 0ad4a57

Browse files
smartergriggt
andauthored
ClassfileParser: Avoid cycle when accessing companion in inner class lookup (#16882)
Previously, the call to `info` on the module val could lead to a cycle since the module val might be in the process of being completed. This commit fixes this by only using the module class which is all we need to lookup members. Fixes #15288. Fixes #14059. Co-Authored-By: Tom Grigg <[email protected]>
2 parents 5d08f2c + f77069a commit 0ad4a57

File tree

5 files changed

+21
-4
lines changed

5 files changed

+21
-4
lines changed

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,10 +1086,10 @@ class ClassfileParser(
10861086
if (sym == classRoot.symbol)
10871087
staticScope.lookup(name)
10881088
else {
1089-
var module = sym.companionModule
1090-
if (!module.exists && sym.isAbsent())
1091-
module = sym.scalacLinkedClass
1092-
module.info.member(name).symbol
1089+
var moduleClass = sym.registeredCompanion
1090+
if (!moduleClass.exists && sym.isAbsent())
1091+
moduleClass = sym.scalacLinkedClass
1092+
moduleClass.info.member(name).symbol
10931093
}
10941094
else if (sym == classRoot.symbol)
10951095
instanceScope.lookup(name)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
interface CopyableBuilder<B, T> {}
2+
interface ToCopyableBuilder<B, T> {}
3+
4+
public class QueryRequest implements ToCopyableBuilder<QueryRequest.Builder, QueryRequest> {
5+
public static Builder builder() { throw new UnsupportedOperationException(); }
6+
public interface Builder extends CopyableBuilder<Builder, QueryRequest> {
7+
void build();
8+
}
9+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class Test:
2+
def makeQuery = QueryRequest.builder().build()

sbt-test/java-compat/i15288/build.sbt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
scalaVersion := sys.props("plugin.scalaVersion")

sbt-test/java-compat/i15288/test

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
## This could just be a pos test checked by FromTastyTests, but
2+
## ParallelTesting#compileTastyInDir does not support test with multiple files
3+
## currently.
4+
> compile
5+
> doc

0 commit comments

Comments
 (0)