Skip to content

Commit f77069a

Browse files
smartergriggt
andcommitted
ClassfileParser: Avoid cycle when accessing companion in inner class lookup
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]>
1 parent 3d251d6 commit f77069a

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)