JDK-7151070 : NullPointerException in Resolve.isAccessible
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 7
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • OS: linux_ubuntu
  • CPU: x86
  • Submitted: 2012-03-05
  • Updated: 2012-03-30
  • Resolved: 2012-03-19
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7 JDK 8
7u6Fixed 8 b30Fixed
Related Reports
Relates :  
Description
FULL PRODUCT VERSION :
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)


ADDITIONAL OS VERSION INFORMATION :
Linux PC1374 3.0.0-16-generic #28-Ubuntu SMP Fri Jan 27 17:44:39 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

A DESCRIPTION OF THE PROBLEM :
Compiler throws a NullPointerException in Resolve.isAccessible when a package-prive class is used in (at least) generics of a public class (see source).

REGRESSION.  Last worked in version 6u29

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Use source delivered, and compile using:

javac -source 1.7 -target 1.7 -encoding utf-8 data/Dto.java data/Dao.java wicket/BugTest.java

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Compiler delivers a readable warning that the (abstract) class Dto should be visible for use in Dao<V extends Dto>

or; should this be legal (I'm doubting that, since Dto would be referenced in Dao to the outside world?); just compile everything.
ACTUAL -
NullPointerException (see Error message)

ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.NullPointerException
	at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:162)
	at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:216)
	at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:212)
	at com.sun.tools.javac.comp.Resolve$AccessError.getDiagnostic(Resolve.java:2260)
	at com.sun.tools.javac.comp.Resolve.logResolveError(Resolve.java:1822)
	at com.sun.tools.javac.comp.Resolve.logAccessError(Resolve.java:1812)
	at com.sun.tools.javac.comp.TransTypes.cast(TransTypes.java:110)
	at com.sun.tools.javac.comp.TransTypes.coerce(TransTypes.java:126)
	at com.sun.tools.javac.comp.TransTypes.retype(TransTypes.java:160)
	at com.sun.tools.javac.comp.TransTypes.visitApply(TransTypes.java:601)
	at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1321)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.translateArgs(TransTypes.java:190)
	at com.sun.tools.javac.comp.TransTypes.visitApply(TransTypes.java:598)
	at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1321)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.visitExec(TransTypes.java:564)
	at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1167)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
	at com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:160)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:781)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.visitMethodDef(TransTypes.java:459)
	at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:669)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
	at com.sun.tools.javac.tree.TreeTranslator.visitClassDef(TreeTranslator.java:134)
	at com.sun.tools.javac.comp.TransTypes.translateClass(TransTypes.java:871)
	at com.sun.tools.javac.comp.TransTypes.visitClassDef(TransTypes.java:446)
	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:591)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
	at com.sun.tools.javac.tree.TreeTranslator.visitClassDef(TreeTranslator.java:134)
	at com.sun.tools.javac.comp.TransTypes.translateClass(TransTypes.java:871)
	at com.sun.tools.javac.comp.TransTypes.visitClassDef(TransTypes.java:446)
	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:591)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.translateTopLevelClass(TransTypes.java:898)
	at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1375)
	at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1271)
	at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:870)
	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:829)
	at com.sun.tools.javac.main.Main.compile(Main.java:419)
	at com.sun.tools.javac.main.Main.compile(Main.java:333)
	at com.sun.tools.javac.main.Main.compile(Main.java:324)
	at com.sun.tools.javac.Main.compile(Main.java:76)
	at com.sun.tools.javac.Main.main(Main.java:61)


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
// -- FILE: data/Dto.java

package data;

abstract class Dto { }

// -- FILE: data/Dao.java

package data;

public abstract class BugDao<V extends Dto> {
  public void delete(V dto) { }
  
  public static class TestDto extends Dto { }

  public static class TestDao extends BugDao<TestDto> { }
}

// -- FILE: bug/BugTest.java

package bug;

import data.BugDao.TestDao;
import data.BugDao.TestDto;

public class BugTest {
  private TestDao dao;

  public void test(Test<TestDto> obj) {
    dao.delete(obj.getObject());
  }

  public static class Test<T> {
    public T getObject() {
      return null;
    }
  }
}
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
make type Dto (data/Dto.java) public, instead of package-private (default)

Comments
SUGGESTED FIX A webrev of this fix is available at the following URL: http://hg.openjdk.java.net/jdk8/tl/langtools/rev/c2234816495f
06-03-2012

EVALUATION The code for checking accessibility of target type in synthetic cast looks wrong. It always call getEnclosingType on the target type of the cast, which doesn't make a lot of sense. AccessError error = new AccessError(env, type.getEnclosingType(), type.tsym); logResolveError(error, tree.pos(), type.getEnclosingType().tsym, type.getEnclosingType(), null, null, null); This should probably be: AccessError error = new AccessError(env, env.enclClass.type, type.tsym); logResolveError(error, tree.pos(), env.enclClass.sym, env.enclClass.type, null, null, null);
05-03-2012