RFR: 8198378: javac crash when checking imports and a broken class is present
Jan Lahoda
jan.lahoda at oracle.com
Fri Jun 1 15:19:08 UTC 2018
Hi,
Consider these two files:
---pkg/Missing.java
broken
---Test.java
import pkg.Missing;
---
Compiled like this:
$ javac -sourcepath . -XDdev Test.java
This crashes in Check.isCanonical, because in Resolve.loadClass, the
BadClassFile exception is rethrown, which in turn will lead to
unattributed "pkg.Missing" tree, which will lead to the
Check.isCanonical crash. The BadClassFile should be handled on this
place (I tried it to do in a way that does not change the printed error).
While looking at this, it turned out that in a case like this:
---pkg/Missing.java
broken
---Test.java
import pkg.*;
public class Test {
Missing m;
}
---
When this is compiled, it will lead to an error that does not seem ideal:
---
Test.java:3: error: cannot find symbol
Missing m;
^
symbol: class Missing
location: class Test
---
The reason is that the BadClassFile is caught and thrown away in
Check.importAccessible. Rethrowing he error, and handling it more
appropriately in TypeEnter leads to:
---
Test.java:3: error: cannot access Missing
Missing m;
^
bad source file: ./pkg/Missing.java
file does not contain class pkg.Missing
Please remove or make sure it appears in the correct subdirectory
of the sourcepath.
---
For this, I tried to make the behavior close to the JDK 8 behavior for
cases like:
import pkg.Class.*; //which (by itself) passed even if there was a
broken subclass
import static pkg.Class.*; //which caused a compile-time error
(This is the purpose of the change in Scope.)
Bug: https://bugs.openjdk.java.net/browse/JDK-8198378
Webrev: http://cr.openjdk.java.net/~jlahoda/8198378/webrev.00/
How does this look?
Thanks,
Jan
More information about the compiler-dev
mailing list