RFR: 8320220: Compilation of cyclic hierarchy causes infinite recursion

Archie Cobbs acobbs at openjdk.org
Mon Feb 24 16:48:54 UTC 2025


On Mon, 24 Feb 2025 15:48:36 GMT, Archie Cobbs <acobbs at openjdk.org> wrote:

>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java line 2380:
>> 
>>> 2378:                 seenClasses.stream()
>>> 2379:                   .filter(s -> !s.type.isErroneous())
>>> 2380:                   .filter(ClassSymbol.class::isInstance)
>> 
>> wouldn't a ClassSymbol method be better here like ClassSymbol::isSubClass?
>
>> wouldn't a ClassSymbol method be better here like ClassSymbol::isSubClass?
>> ...
>> this method will invoke Class::isInstance again, probably better to just do (c -> (ClassSymbol)c)?
> 
> My goal was to replicate the existing logic, but do it for every class in `seenClasses` instead of just the current one. But I was not able to prove to myself that every symbol in `seenClasses` is in fact a `ClassSymbol`, although that may actually be true in practice. So that's why the code is being careful not to blind casting everything in `seenClasses` to `ClassSymbol`.
> 
> If you're confident that every symbol in `seenClasses` is always a `ClassSymbol` then we can simplify this... but if so, why wasn't `seenClasses` declared as a `Set<ClassSymbol>` instead of a `Set<Symbol>` in the first place? I'm wondering there is some weird (probably invalid) input that could cause that assumption to be violated.
> 
> Thanks for taking a look.

Following up on previous comment...

>  I'm wondering there is some weird (probably invalid) input that could cause that assumption to be violated.

In fact, if we just blindly cast then there are 3 regression test failures. In particular, this input crashes the compiler:

public class Cyclic {
    static class Outer {
      class Inner {}
    }
    static class Test<X extends Outer>  {
       class InnerTest extends X.Inner { InnerTest(Outer o) {o.super();} }
    }
}

with this error:

Finished building target 'interim-langtools' in configuration 'macosx-aarch64-server-release'
An exception has occurred in the compiler (25-internal). Please file a bug against the Java compiler via the Java bug reporting page (https://bugreport.java.com) after checking the Bug Database (https://bugs.java.com) for duplicates. Include your program, the following diagnostic, and the parameters passed to the Java compiler in your report. Thank you.
java.lang.ClassCastException: class com.sun.tools.javac.code.Symbol$TypeVariableSymbol cannot be cast to class com.sun.tools.javac.code.Symbol$ClassSymbol (com.sun.tools.javac.code.Symbol$TypeVariableSymbol and com.sun.tools.javac.code.Symbol$ClassSymbol are in module jdk.compiler.interim of loader 'app')
	at jdk.compiler.interim/com.sun.tools.javac.comp.Check$CycleChecker.checkSymbol(Check.java:2329)
	at jdk.compiler.interim/com.sun.tools.javac.comp.Check$CycleChecker.visitIdent(Check.java:2345)
	at jdk.compiler.interim/com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:2710)
	at jdk.compiler.interim/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
        ...

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/23704#discussion_r1968030240


More information about the compiler-dev mailing list