-
Bug
-
Resolution: Fixed
-
P4
-
7
-
b34
-
generic
-
generic
-
Not verified
This program wrongly generates an 'illegal forward reference' error (at obj's declaration...even if the error was justified, it should occur at obj's use) :-
class Huh {
Runnable r = new Runnable() {
public void run() {
Object o = obj;
}
};
final Object obj = r;
}
The following program is morally equivalent (the JLS treats instance variable initializers and instance initializers uniformly) and does not generate an error:
class Huh {
Runnable r;
{
r = new Runnable() {
public void run() {
Object o = obj;
}
};
}
final Object obj = r;
}
Simpler test case, given the following program
class Test {
final int a = b;
final int b = a;
}
the compiler should report only ONE error, instead of two, as it can be seen from the output:
Test.java:33: illegal forward reference
final int a = b;
^
Test.java:34: illegal forward reference
final int b = a;
^
2 errors
While the first error is correct, the second one is a bug, accordingly to JLS 8.3.2.3
class Huh {
Runnable r = new Runnable() {
public void run() {
Object o = obj;
}
};
final Object obj = r;
}
The following program is morally equivalent (the JLS treats instance variable initializers and instance initializers uniformly) and does not generate an error:
class Huh {
Runnable r;
{
r = new Runnable() {
public void run() {
Object o = obj;
}
};
}
final Object obj = r;
}
Simpler test case, given the following program
class Test {
final int a = b;
final int b = a;
}
the compiler should report only ONE error, instead of two, as it can be seen from the output:
Test.java:33: illegal forward reference
final int a = b;
^
Test.java:34: illegal forward reference
final int b = a;
^
2 errors
While the first error is correct, the second one is a bug, accordingly to JLS 8.3.2.3