<div dir="ltr">Great, thanks Jan.<div><br></div><div>I'm curious what the resolution will be. The only solution that occurs to me is to make a pass over all of the imports and ignore any that can't be processed, and then keep retrying until a fixed point is reached. But that's unsatisfying for a variety of reasons.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 16, 2015 at 1:05 PM, Jan Lahoda <span dir="ltr"><<a href="mailto:jan.lahoda@oracle.com" target="_blank">jan.lahoda@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks Liam, I can reproduce now. I've filled:<br>
<a href="https://bugs.openjdk.java.net/browse/JDK-8075274" target="_blank">https://bugs.openjdk.java.net/<u></u>browse/JDK-8075274</a><br>
<br>
Thanks,<br>
   Jan<div><div class="h5"><br>
<br>
On 16.3.2015 16:23, Liam Miller-Cushon wrote:<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
Hi Jan,<br>
<br>
I see the same behaviour with JDK 9 b54. I've included a more verbose<br>
version of the repro below. Sorry if I'm missing something obvious.<br>
<br>
One additional bit of weirdness is that the order of the source files<br>
passed to javac matters: the issue occurs for "P/Outer.java P/Q/C.java<br>
P/Q/D.java" but not "P/Q/C.java P/Q/D.java P/Outer.java".<br>
<br>
Here's the repro:<br>
<br>
$ ~/jdk/jdk1.9.0/bin/java -version<br>
java version "1.9.0-ea"<br>
Java(TM) SE Runtime Environment (build 1.9.0-ea-b54)<br>
Java HotSpot(TM) 64-Bit Server VM (build 1.9.0-ea-b54, mixed mode)<br>
<br>
$ for f in $(find . -name "*.java"); do echo "=== $f ==="; cat $f; done<br>
=== ./P/Q/C.java ===<br>
package P.Q;<br>
<br>
public class C extends D {<br>
}<br>
=== ./P/Q/D.java ===<br>
package P.Q;<br>
<br>
public class D {<br>
   public interface I {<br>
   }<br>
}<br>
=== ./P/Outer.java ===<br>
package P;<br>
<br>
import static P.Outer.Nested.*;<br>
import static P.Q.C.*;<br>
<br>
public class Outer {<br>
   public static class Nested implements I {<br>
   }<br>
}<br>
<br>
$ ~/jdk/jdk1.9.0/bin/javac P/Outer.java P/Q/C.java P/Q/D.java<br>
P/Outer.java:7: error: cannot find symbol<br>
   public static class Nested implements I {<br>
                                         ^<br>
   symbol:   class I<br>
   location: class Outer<br>
1 error<br>
<br>
# Now, flip the order of the two imports in P.Outer<br>
<br>
$ for f in $(find . -name "*.java"); do echo "=== $f ==="; cat $f; done<br>
=== ./P/Q/C.java ===<br>
package P.Q;<br>
<br>
public class C extends D {<br>
}<br>
=== ./P/Q/D.java ===<br>
package P.Q;<br>
<br>
public class D {<br>
   public interface I {<br>
   }<br>
}<br>
=== ./P/Outer.java ===<br>
package P;<br>
<br>
import static P.Q.C.*;<br>
import static P.Outer.Nested.*;<br>
<br>
public class Outer {<br>
   public static class Nested implements I {<br>
   }<br>
}<br>
<br>
$ ~/jdk/jdk1.9.0/bin/javac P/Outer.java P/Q/C.java P/Q/D.java<br>
<br>
# ... compiles cleanly<br>
<br>
<br>
<br>
On Mon, Mar 16, 2015 at 1:08 AM, Jan Lahoda <<a href="mailto:jan.lahoda@oracle.com" target="_blank">jan.lahoda@oracle.com</a><br></div></div><div><div class="h5">
<mailto:<a href="mailto:jan.lahoda@oracle.com" target="_blank">jan.lahoda@oracle.com</a>><u></u>> wrote:<br>
<br>
    Hi Liam,<br>
<br>
    Thanks for the report. I am afraid I was not able to reproduce. I<br>
    tried on:<br>
    $ javac -fullversion<br>
    javac full version "1.9.0-ea-b54"<br>
<br>
    and on a custom build from jdk9/dev/langtools, tip:<br>
    $ hg tip<br>
    changeset:   2850:32a2e7249884<br>
    tag:         tip<br>
    parent:      2849:75cedc6db8c2<br>
    parent:      2848:f5a1cb1309ae<br>
    user:        lana<br>
    date:        Thu Mar 12 21:13:42 2015 -0700<br>
    summary:     Merge<br>
<br>
    Is there something special I need to do? Could you please try on JDK<br>
    9 b54?<br>
<br>
    Thanks,<br>
         Jan<br>
<br>
<br>
    On 15.3.2015 23:00, Liam Miller-Cushon wrote:<br>
<br>
        I think I found a bug related to JEP 216. With javac9-dev @<br>
        r2850, the<br>
        following program fails to compile unless the order of imports<br>
        is reversed.<br>
<br>
        It looks like the current implementation isn't lazy enough to<br>
        handle the<br>
        dependency between the two on-demand imports if 'I' is inherited<br>
        into<br>
        'C'. If 'I' is declared directly in 'C' then it works.<br>
<br>
        {{{<br>
        package P;<br>
<br>
        import static P.Outer.Nested.*;<br>
        import static P.Q.C.*;<br>
<br>
        public class Outer {<br>
            public static class Nested implements I {<br>
            }<br>
        }<br>
<br>
        package P.Q;<br>
<br>
        public class C extends D {<br>
        }<br>
<br>
        package P.Q;<br>
<br>
        public class D {<br>
            public interface I {<br>
            }<br>
        }<br>
        }}}<br>
<br>
        $ javac P/Outer.java P/Q/D.java P/Q/C.java<br>
        P/Outer.java:7: error: cannot find symbol<br>
            public static class Nested implements I {<br>
                                                  ^<br>
            symbol:   class I<br>
            location: class Outer<br>
        1 error<br>
<br>
<br>
</div></div></blockquote>
</blockquote></div><br></div>