JDK-4452115 : javac allows access to a local class by using a synthetic name
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 1.4.0
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: generic
  • CPU: generic
  • Submitted: 2001-04-28
  • Updated: 2001-05-24
  • Resolved: 2001-05-24
Related Reports
Duplicate :  
Relates :  
Relates :  
Description

Name: poR10007			Date: 04/28/2001



Javac (jdk1.4.0beta-b62, jdk1.3.1-b23) allows access to a local
class by using a synthetic name that compiler constructs to represent
a local class. Through this synthetic name the class is accessible
even outside of its scope.

That contradicts the following assertions of JLS-2,
14.3 "Local class declarations":

  "The scope of a local class declared in a block is the rest of the
   immediately enclosing block, including its own class declaration."
   
  "A local class does not have a canonical name, nor does it have a fully
   qualified name."
   
The following test demonstrates the behavior:

--stmt16503_a.java--------------------------------------------
public class stmt16503_a {
    public static void test() {
        class Local {};
    }
}
--------------------------------------------------------------

--stmt16503.java----------------------------------------------
public class stmt16503 {
    public static void main(String argv[]) {
        Object a = new stmt16503_a$1$Local();
    }
}
--------------------------------------------------------------

The class Local can be accessed from a method of class stmt16503 by using
the name stmt16503_a$1$Local. To reproduce the bug classes should be compiled
in sequence - stmt16503_a.java, then stmt16503.java.
Compiler correctly detects the error when classes are compiled together.

The execution log is following:

$ jdk1.4.0beta-b62/solsparc/bin/java -version                     
java version "1.4.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta-b62)
Java HotSpot(TM) Client VM (build 1.4.0-beta-b62, mixed mode)
$ jdk1.4.0beta-b62/solsparc/bin/javac -d . stmt16503_a.java stmt16503.java; echo 
$?
stmt16503.java:3: cannot resolve symbol
symbol  : class stmt16503_a$1$Local  
location: class stmt16503
        Object a = new stmt16503_a$1$Local();
                       ^
1 error
1
$ jdk1.4.0beta-b62/solsparc/bin/javac -d . stmt16503_a.java; echo $?
0
$ jdk1.4.0beta-b62/solsparc/bin/javac -d . stmt16503.java; echo $?
0
$ jdk1.4.0beta-b62/solsparc/bin/java stmt16503; echo $?
0
$ 

======================================================================

Comments
EVALUATION Yes. We should give an error whevever the user utters the name of a synthetic. neal.gafter@Eng 2001-05-23
23-05-2001