RFR: JDK-8230105: -XDfind=diamond crashes

Vicente Romero vicente.romero at oracle.com
Wed Aug 28 19:03:49 UTC 2019


Hi Jan,

I like the patch, I think it is very sensible. I just have a cosmetic 
comment. I think that rebranding speculative attribution to a concept 
based on its side-effects could bring confusion in the future as the 
concept of speculative attribution is very deep in the understanding we 
have of the attribution process. So what I'm proposing is just a change 
in the name to the three states you defined, just a proposal:

enum AttributionMode {
     NON_SPECULATIVE(false),
     ANALYZER(true)
     SPECULATIVE(true);

     AttributionMode(boolean isSpeculative) {
         this.isSpeculative = isSpeculative;
     }

     boolean isSpeculative() {
         return isSpeculative;
     }

     final isSpeculative;
}

we can work on the names but my proposal is to put the speculative-ness 
of the attribution foremost and the side-effect-ness in second place. 
What do you think?

Vicente

On 8/26/19 6:50 AM, Jan Lahoda wrote:
> Hi,
>
> JBS: https://bugs.openjdk.java.net/browse/JDK-8230105
> Proposed webrev: http://cr.openjdk.java.net/~jlahoda/8230105/webrev.00/
>
> Consider this code:
> ---
> public class AnalyzerNotQuiteSpeculative {
>     private void test() {
>         Subclass1 c1 = null;
>         Subclass2 c2 = null;
>         Base b = null;
>
>         t(new C<Base>(c1).set(c2));
>         t(new C<Base>(b).set(c2));
>     }
>
>     public static class Base {}
>     public static class Subclass1 extends Base {}
>     public static class Subclass2 extends Base {}
>     public class C<T extends Base> {
>         public C(T t) {}
>         public C<T> set(T t) { return this; }
>     }
>     <T extends Base> void t(C<? extends Base> l) {}
> }
> ---
>
> When run with -XDfind=diamond, this crashes with:
> ---
>
>     at 
> jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:162)
>     at 
> jdk.compiler/com.sun.tools.javac.comp.Analyzer.doAnalysis(Analyzer.java:581)
> ...
> ---
>
> The embedded (thrown away) exception is:
> ---
> java.lang.NullPointerException
>     at 
> jdk.compiler/com.sun.tools.javac.comp.Analyzer$DiamondInitializer.process(Analyzer.java:261)
>     at 
> jdk.compiler/com.sun.tools.javac.comp.Analyzer$DiamondInitializer.process(Analyzer.java:225)
>     at 
> jdk.compiler/com.sun.tools.javac.comp.Analyzer.doAnalysis(Analyzer.java:579)
>     at 
> jdk.compiler/com.sun.tools.javac.comp.Analyzer$2.flush(Analyzer.java:552)
>     at 
> jdk.compiler/com.sun.tools.javac.comp.Analyzer.flush(Analyzer.java:594)
>     at 
> jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1412)
>     at 
> jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1380)
>     at 
> jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:972)
>     at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:318)
>     at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
>     at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
>     at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
> ---
>
> The reason for this exception seems to be that when the Analyzer is 
> speculatively analyzing "t(new C<Base>(c1).set(c2));", 
> ArgumentAttr.setResult will set a deferred type to "new 
> C<Base>(c1).set(c2)" (because isSpeculative is true), which in turn 
> will prevent the tree from being actually attributed. So when the 
> analyzer asks for type of "new C<Base>(c1)", it gets null.
>
> It ultimate problem appears to be that analyzers want to analyze a 
> piece of AST "as if" it was part of the source code, but without 
> having permanent side effects. But, currently, there is only the 
> AttrContext.isSpeculative boolean, which means both "no permanent 
> sideeffects" and "the tree is a scratch tree, that can be modified in 
> any way", and the latter is not quite the case when doing spec 
> attribution for analyzers.
>
> The proposed solution is to make the isSpeculative flag 3 tristate (by 
> using enum and renaming the field), which should allow us to 
> differentiate between "actual AST", "AST in analyzer" and "actual 
> speculative AST".
>
> I also created a patch that runs analyzers on all source code which 
> building and testing JDK, and fixed a few smallish trouble it found. 
> The patch to run the analyzers is not part of the proposed patch, but 
> can be seen here:
> http://cr.openjdk.java.net/~jlahoda/8230105/webrev.runall/
>
> How does this look?
>
> Thanks,
>     Jan



More information about the compiler-dev mailing list